Как получить количество полей в объекте JavaScript?

Я пытаюсь использовать объект JavaScript как ассоциативный массив, и все было хорошо, пока мне не понадобилось получить количество записей, которые хранятся в нем. Какой самый простой и элегантный способ сделать это? Все, о чем я могу думать, это запустить функцию for each loop или jQuery $.each и просто посмотреть, сколько итераций она сделает, но это выглядит как ужасная вещь.

Ответ 1

Старый Firefox поддерживает свойство __count__. Новые среды поддерживают ES5 Object.keys. Для более старых сред мы должны отступать, чтобы просто перебирать объект и подсчитывать вручную (ugh!):

function count(obj) {

    if (obj.__count__ !== undefined) { // Old FF
        return obj.__count__;
    }

    if (Object.keys) { // ES5 
        return Object.keys(obj).length;
    }

    // Everything else:

    var c = 0, p;
    for (p in obj) {
        if (obj.hasOwnProperty(p)) {
            c += 1;
        }
    }

    return c;

}

Ответ 2

Это сработало для меня:

Object.keys(obj).length

Ответ 3

Я считаю, что на этот вопрос ответили раньше, и/или googling может привести вас в правильном направлении. Тем не менее, позвольте мне отметить, что одна из самых больших ошибок, если вы используете цикл в форме:

for (var attr in obj) { ....

Это то, что объект может быть загроможден свойствами, которые вы не обязательно добавляли, и стандартным решением для этого, как я помню, является использование теста для hasOwnProperty, см. https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty

Ответ 4

Это сводится к этому, или учет количества, когда вы добавляете и удаляете свойства объекта.

Ответ 5

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

function countProps(obj) {
    var l = 0;
    for (p in obj) l++;
    return l;
}

var bob = { a: 1, b: 2};

alert(countProps(bob));