Количество элементов в объекте javascript



есть ли способ получить (откуда-то) количество элементов в объекте javascript?? (т. е. постоянная-временная сложность).



Я не могу найти свойство или метод получения этой информации. Пока я могу думать только о том, чтобы сделать итерацию по всей коллекции, но это линейное время.

Странно, что нет прямого доступа к размеру объекта, не так ли.



EDIT:

Я говорю о

705   7  

7 ответов:

хотя реализации JS могут отслеживать такое значение внутри, нет стандартного способа его получить.

в прошлом, вариант Javascript Mozilla выставил нестандартное __count__, но он был удален с версии 1.8.5.

для кросс-браузерных сценариев вы застряли с явным перебором свойств и проверкой hasOwnProperty():

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

в случае реализации ECMAScript 5, это также может быть написано как (Слава Ави Лен)

function countProperties(obj) {
    return Object.keys(obj).length;
}

имейте в виду, что вы также пропустите свойства, которые не являются перечислимыми (например, массив length).

если вы используете фреймворк, такой как jQuery, Prototype, Mootools, $whatever-the-newest-hype, проверьте, поставляются ли они со своими собственными коллекциями API, что может быть лучшим решением вашей проблемы, чем использование собственных объектов JS.

чтобы сделать это в любой ES5-совместимой среде

Object.keys(obj).length

(поддержка браузера от здесь)
(Док на объект.ключи здесь, включает метод, который вы можете добавить в браузеры, отличные от ECMA5)

Если вы уже используете jQuery в своей сборке просто сделайте это:

$(yourObject).length

он отлично работает для меня на объектах, и у меня уже был jQuery в качестве зависимости.

function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

AFAIK, нет никакого способа сделать это надежно, если вы не переключитесь на массив. Что честно,не кажется странным-мне кажется, что массивы являются счетными, а объекты-нет.

наверное, ближе всего вы получите что-то вроде этого

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

но это создает проблемы, или, по крайней мере, вопросы. Учитываются все созданные пользователем свойства, включая саму функцию _length! И хотя в этом простом примере вы можно было бы избежать этого, просто используя обычную функцию, что не означает, что вы можете остановить другие скрипты от этого. так что же делать? Игнорировать свойства функции?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

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

понятие числа / длины / размерности на самом деле не имеет смысла для объекта, и необходимость в нем предполагает, что вы действительно хотите массив для меня.

Edit: указал мне, что вы хотите O(1) для этого. Насколько мне известно, такого способа не существует.

вы можете использовать:

({ foo:55, bar:99 }).__count__ // is: 2

принято от здесь

Comments

    Ничего не найдено.