Как получить длину объекта

Есть ли встроенная функция, которая может возвращать длину объекта?

Например, у меня есть a = { 'a':1,'b':2,'c':3 }, который должен возвращать 3. Если я использую a.length, он возвращает undefined.

Это может быть простая функция цикла, но я хотел бы знать, есть ли встроенная функция?

Существует связанный с этим вопрос (Длина объекта JSON) - в выбранном ответе пользователь советует преобразовать объект в массив, что не очень удобно для моя задача.

Ответ 1

Для браузеров, поддерживающих Object.keys(), вы можете просто:

Object.keys(a).length;

В противном случае (особенно в IE < 9) вы можете прокручивать объект самостоятельно с помощью цикла for (x in y):

var count = 0;
var i;

for (i in a) {
    if (a.hasOwnProperty(i)) {
        count++;
    }
}

hasOwnProperty должен убедиться, что вы только считаете свойства из литерала объекта, а не свойства, которые он "наследует" от своего прототипа.

Ответ 2

Легко сделать с помощью $.map():

var len = $.map(a, function(n, i) { return i; }).length;

Ответ 3

Это должно сделать это:

Object.keys(a).length

Однако Object.keys не поддерживается в IE8 и ниже, Opera и FF 3.6 и ниже.

Live demo: http://jsfiddle.net/simevidas/nN84h/

Ответ 4

Вы взглянули на underscore.js (http://underscorejs.org/docs/underscore.html)? Это полезная библиотека с множеством полезных методов. Существует метод коллекции size, а также метод toArray, который может предоставить вам то, что вам нужно.

_.size({one : 1, two : 2, three : 3});
=> 3

Ответ 5

Суммируя все вместе, вот универсальная функция (включая поддержку ie8):

var objSize = function(obj) {
    var count = 0;
    
    if (typeof obj == "object") {
    
        if (Object.keys) {
            count = Object.keys(obj).length;
        } else if (window._) {
            count = _.keys(obj).length;
        } else if (window.$) {
            count = $.map(obj, function() { return 1; }).length;
        } else {
            for (var key in obj) if (obj.hasOwnProperty(key)) count++;
        }
        
    }
    
    return count;
};

document.write(objSize({ a: 1, b: 2, c: 3 }));
// 3

Ответ 6

В jQuery я сделал это следующим образом:

len = function(obj) {
    var L=0;
    $.each(obj, function(i, elem) {
        L++;
    });
    return L;
}

Ответ 7

Поэтому не нужно искать и заменять метод Object.keys, другим подходом был бы этот код в начале выполнения script:

if(!Object.keys)
{
  Object.keys = function(obj)
  {
    return $.map(obj, function(v, k)
    {
      return k;
    });
  };
 }

Ответ 8

Здесь jQuery-ised функция ответа Innuendo, готовая к использованию.

$.extend({
    keyCount : function(o) {
        if(typeof o == "object") {
            var i, count = 0;
            for(i in o) {
                if(o.hasOwnProperty(i)) {
                    count++;
                }
            }
            return count;
        } else {
            return false;
        }
    }
});

Можно вызвать так:

var cnt = $.keyCount({"foo" : "bar"}); //cnt = 1;

Ответ 9

Еще один ответ:

var j = '[{"uid":"1","name":"Bingo Boy", "profile_img":"funtimes.jpg"},{"uid":"2","name":"Johnny Apples", "profile_img":"badtime.jpg"}]';

obj = Object.keys(j).length;
console.log(obj)

Ответ 10

Для тех, кто приходит сюда, чтобы найти количество элементов того, что уже является объектом jQuery:
.length - это то, что вы ищете:

Пример:

len = $('#divID').length;
alert(len);

Ответ 11

Ключ в объекте можно подсчитать с помощью Object

Object.keys(obj).length

Он вернет длину ключей в объекте. Если он возвращает 0, значит, объект пуст.

Ответ 12

Если вы хотите избежать новых зависимостей, вы можете создать свои собственные интеллектуальные объекты. Конечно, только если вы хотите сделать больше, просто получите его размер.

MyNeatObj = function (obj) {
  var length = null;

  this.size = function () {
    if (length === null) {
      length = 0;
      for (var key in obj) length++;
    }
    return length;
  }
}

var thingy = new MyNeatObj(originalObj);
thingy.size();

Ответ 13

Вы можете использовать что-то вроде Lodash lib и _.toLength(object) должны предоставить вам длину вашего объекта

Ответ 14

Вы можете добавить другое имя: пара значений длины и приращение/уменьшить его соответствующим образом. Таким образом, когда вам нужно запрашивать длину, вам не нужно каждый раз перебирать все свойства объектов, и вам не нужно полагаться на определенный браузер или библиотеку. Конечно, все зависит от вашей цели.

Ответ 15

У вас может быть свойство undefined в объекте. Если используется метод Object.keys(data).length, эти свойства также будут учитываться.

Вы можете отфильтровать их.

Object.keys(data).filter((v) => {return data[v] !== undefined}).length

Ответ 16

jQuery(OBJECT).size();

Пример:

var a = { 'a':1,'b':2,'c':3 };
jQuery(a).size();