Как эффективно посчитать количество ключей / свойств объекта в JavaScript? - PullRequest
1358 голосов
/ 24 сентября 2008

Какой самый быстрый способ подсчитать количество ключей / свойств объекта? Можно ли сделать это без перебора объекта? т.е. без выполнения

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;

(Firefox действительно имел магическое свойство __count__, но оно было удалено где-то в версии 4.)

Ответы [ 20 ]

6 голосов
/ 21 августа 2015

От: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Object.defineProperty (obj, prop, descriptor)

Вы можете добавить его ко всем своим объектам:

Object.defineProperty(Object.prototype, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

Или один объект:

var myObj = {};
Object.defineProperty(myObj, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

Пример:

var myObj = {};
myObj.name  = "John Doe";
myObj.email = "leaked@example.com";
myObj.length; //output: 2

Добавлен этот способ, он не будет отображаться в for..in циклах:

for(var i in myObj) {
     console.log(i + ":" + myObj[i]);
}

Выход:

name:John Doe
email:leaked@example.com

Примечание: он не работает в браузерах

5 голосов
/ 28 июня 2011

Как я решил эту проблему, так это построил собственную реализацию базового списка, который хранит записи о том, сколько элементов хранится в объекте. Это очень просто. Примерно так:

function BasicList()
{
   var items = {};
   this.count = 0;

   this.add = function(index, item)
   {
      items[index] = item;
      this.count++;
   }

   this.remove = function (index)
   {
      delete items[index];
      this.count--;
   }

   this.get = function(index)
   {
      if (undefined === index)
        return items;
      else
        return items[index];
   }
}
3 голосов
/ 12 апреля 2012

Для тех, кто имеет Ext JS 4 в своем проекте, вы можете сделать:

Ext.Object.getSize(myobj);

Преимущество этого заключается в том, что он будет работать во всех совместимых с Ext браузерах (включая IE6-IE8), однако, я считаю, что время выполнения не лучше, чем O (n), как и в других предлагаемых решениях. *

1 голос
/ 10 июля 2018

Вы можете использовать Object.keys(data).length, чтобы найти длину объекта JSON, имеющего ключевые данные

1 голос
/ 02 сентября 2012

Если jQuery выше не работает, попробуйте

$(Object.Item).length
0 голосов
/ 28 февраля 2018

Вы можете использовать: Object.keys(objectName).length; & Object.values(objectName).length;

0 голосов
/ 14 апреля 2018

Я пытаюсь сделать его доступным для всех объектов следующим образом:

Object.defineProperty(Object.prototype, "length", {
get() {
    if (!Object.keys) {
        Object.keys = function (obj) {
            var keys = [],k;
            for (k in obj) {
                if (Object.prototype.hasOwnProperty.call(obj, k)) {
                    keys.push(k);
                }
            }
            return keys;
        };
    }
    return Object.keys(this).length;
},});

console.log({"Name":"Joe","Age":26}.length) //returns 2
0 голосов
/ 13 декабря 2011

У Google Closure есть хорошая функция для этого ... goog.object.getCount (obj)

посмотрите на goog. Объектная документация

0 голосов
/ 07 февраля 2019

Вы также можете разобрать Json, используя

JSON.parse(array).lenght
0 голосов
/ 24 сентября 2008

Я не думаю, что это возможно (по крайней мере, без использования некоторых внутренних устройств). И я не думаю, что вы бы много выиграли, оптимизировав это.

...