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


этот вопрос уже есть ответ здесь:

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

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

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

9   143   2009-08-28 13:25:28

9 ответов:

нет простого ответа, потому что 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 прототип.

вы можете сделать это с помощью этого простого кода:

Object.keys(myObject).length

использовать подчеркивание библиотека, очень полезно: _.keys(obj).length.

 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

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

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

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

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

эта функция использует 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;

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 и вставить его в начале времени выполнения ( перед вызовом счетчика ).

Дайте мне знать, если это работает для вас!

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

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

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

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

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