Количество элементов в объекте javascript
есть ли способ получить (откуда-то) количество элементов в объекте javascript?? (т. е. постоянная-временная сложность).
Я не могу найти свойство или метод получения этой информации. Пока я могу думать только о том, чтобы сделать итерацию по всей коллекции, но это линейное время.
Странно, что нет прямого доступа к размеру объекта, не так ли.
EDIT:
Я говорю о
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.
Если вы уже используете 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