Как подсчитать атрибуты объекта JavaScript?

Предположим, что у меня есть следующий объект в JavaScript:

var object = {
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}; 

Как узнать, сколько значений существует в объекте?

Ответ 1

Нет простого ответа, потому что Object — который каждый объект в JavaScript происходит из — включает в себя множество атрибутов автоматически, и точный набор атрибутов, которые вы получаете, зависит от конкретного интерпретатора и того, что выполнил код перед вашим. Итак, вы каким-то образом должны отделять те, которые вы определили, от тех, которые у вас есть "бесплатно".

Здесь один из способов:

var foo = {"key1": "value1", "key2": "value2", "key3": "value3"};
Object.prototype.foobie = 'bletch'; // add property to foo that won't be counted

var count = 0;
for (var k in foo) {
    if (foo.hasOwnProperty(k)) {
       ++count;
    }
}
alert("Found " + count + " properties specific to foo");

Вторая строка показывает, как другой код может добавлять свойства ко всем производным Object. Если вы удалите проверку hasOwnProperty() внутри цикла, счетчик свойств пойдет не менее 4. На странице с другим JavaScript, кроме этого кода, он может быть выше 4, если этот другой код также изменяет Object прототип.

Ответ 2

Вы можете сделать это, используя этот простой код:

Object.keys(myObject).length

Ответ 3

Используйте underscore библиотеку, очень полезную: _.keys(obj).length.

Ответ 4

Вы можете выполнить итерацию по объекту, чтобы получить ключи или значения:

function numKeys(obj)
{
    var count = 0;
    for(var prop in obj)
    {
        count++;
    }
    return count;
}

Это похоже на "орфографическую ошибку", но просто хочу указать, что ваш пример является недопустимым синтаксисом, должен быть

var object = {"key1":"value1","key2":"value2","key3":"value3"};

Ответ 5

 var miobj = [
  {"padreid":"0", "sw":"0", "dtip":"UNO", "datos":[]},
  {"padreid":"1", "sw":"0", "dtip":"DOS", "datos":[]}
 ];
 alert(miobj.length) //=== 2

, но

 alert(miobj[0].length) //=== undefined

эта функция очень хороша

Object.prototype.count = function () {
    var count = 0;
    for(var prop in this) {
        if(this.hasOwnProperty(prop))
            count = count + 1;
    }
    return count;
}

alert(miobj.count()) // === 2
alert(miobj[0].count()) // === 4

Ответ 6

Эта функция использует свойство Mozilla __count__, если она доступна, поскольку она быстрее, чем итерация по каждому свойству.

function countProperties(obj) {
  var count = "__count__",
  hasOwnProp = Object.prototype.hasOwnProperty;

  if (typeof obj[count] === "number" && !hasOwnProp.call(obj, count)) {
    return obj[count];
  }
  count = 0;
  for (var prop in obj) {
    if (hasOwnProp.call(obj, prop)) {
      count++;
    }
  }
  return count;
};

countProperties({
  "1": 2,
  "3": 4,
  "5": 6
}) === 3;

Ответ 7

EDIT: это приведет к ошибкам с jquery, а также к некоторым другим неудобствам. ВЫ НЕ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ ЭТО: (возможно, если бы вместо функции публичного свойства можно было добавить приватный метод, это было бы нормально, но сейчас у вас нет времени). Сообщество wikied

не использовать:

Несмотря на то, что объект javascript по умолчанию не имеет функции count, классы легко расширяемы, и можно добавить его сами:

Object.prototype.count = function () {
    var count = 0;
    for(var prop in this) {
        if(this.hasOwnProperty(prop))
            count = count + 1;
    }
    return count;
}

Итак, после этого можно выполнить

var object = {'key1': 'val1', 'key2':'val2', 'key3':'val3'};
console.log(object.count()); // 3

Как вывод, если вы хотите использовать функцию подсчета в объектах, вам нужно скопировать код из блока кода 1 и вставить его в начале времени выполнения (до того, как вы вызовете счет).

Сообщите мне, если это сработает для вас!

С уважением, Педро

Ответ 8

Для тех, кто прочитает этот вопрос/ответы, вот реализация JavaScript в коллекции словарей очень похожа на функциональность .NET: JavaScript Dictionary

Ответ 9

Хотя это не будет "истинным объектом", вы всегда можете сделать что-то вроде этого:

var foo = [
  {Key1: "key1"},
  {Key2: "key2"},
  {Key3: "key3"}
];

alert(foo.length); // === 3