Есть ли способ получить (откуда-то) количество элементов в объекте javascript ?? (т.е. постоянная временная сложность).
Я не могу найти свойство или метод, позволяющий получить эту информацию. Пока что я могу думать только об итерации по всей коллекции, но это линейное время.
Странно, что нет прямого доступа к размеру объекта, не правда ли?
РЕДАКТИРОВАТЬ:
я говорю об Object
объекте (а не об объектах в целом):
var obj = new Object ;
javascript
collections
elements
javascript-objects
Получить бесплатно
источник
источник
Ответы:
Хотя реализации JS могут отслеживать такое значение внутренне, стандартного способа получить его не существует.
Раньше вариант Mozilla Javascript обнаруживал нестандартность
__count__
, но в версии 1.8.5 он был удален.Для кроссбраузерного сценария вы застряли в явном переборе свойств и проверке
hasOwnProperty()
:В случае реализаций с поддержкой ECMAScript 5 это также можно записать как (Престижность Avi Flax )
Имейте в виду, что вы также пропустите свойства, которые нельзя перечислить (например, массив
length
).Если вы используете такие фреймворки, как jQuery, Prototype, Mootools, $ what-the-newest-hype, проверьте, поставляются ли они с собственным API коллекций, что может быть лучшим решением вашей проблемы, чем использование собственных объектов JS.
источник
__count__
ушел :(hasOwnProperty()
?Для этого в любой ES5-совместимой среде
(Поддержка браузера отсюда )
(Документ по Object.keys здесь , включает метод, который вы можете добавить в браузеры, отличные от ECMA5)
источник
если вы уже используете jQuery в своей сборке, просто сделайте следующее:
У меня это хорошо работает с объектами, и у меня уже был jQuery в качестве зависимости.
источник
источник
AFAIK, нет возможности сделать это надежно, если вы не переключитесь на массив. Что, честно говоря, не кажется странным - мне кажется довольно очевидным, что массивы являются счетными, а объекты - нет.
Вероятно, самое близкое, что вы получите, это что-то вроде этого
Но это создает проблемы или, по крайней мере, вопросы. Подсчитываются все созданные пользователем свойства, включая саму функцию _length! И хотя в этом простом примере вы можете избежать этого, просто используя обычную функцию, это не значит, что вы можете запретить другим скриптам делать это. так что ты делаешь? Игнорировать свойства функции?
В конце концов, я думаю, вам, вероятно, следует отказаться от идеи делать свои объекты счетными и найти другой способ делать то, что вы делаете.
источник
Концепция числа / длины / размерности на самом деле не имеет смысла для объекта, и необходимость в этом говорит о том, что вы действительно хотите для меня массив.
Изменить: указал мне, что вам нужен O (1) для этого. Боюсь, что, насколько мне известно, такого способа не существует.
источник