Меню Закрыть

Javascript количество свойств объекта

Содержание

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/object.

Для перебора всех свойств из объекта используется цикл по свойствам for..in . Эта синтаксическая конструкция отличается от рассмотренного ранее цикла for(;;) .

for..in

При этом for..in последовательно переберёт свойства объекта obj , имя каждого свойства будет записано в key и вызвано тело цикла.

Вспомогательную переменную key можно объявить прямо в цикле:

Так иногда пишут для краткости кода. Можно использовать и любое другое название, кроме key , например for(var propName in menu) .

Пример итерации по свойствам:

Обратите внимание, мы использовали квадратные скобки menu[key] . Как уже говорилось, если имя свойства хранится в переменной, то обратиться к нему можно только так, не через точку.

Количество свойств в объекте

Как узнать, сколько свойств хранит объект?

Готового метода для этого нет.

Самый кросс-браузерный способ – это сделать цикл по свойствам и посчитать, вот так:

В следующих главах мы пройдём массивы и познакомимся с другим, более коротким, вызовом: Object.keys(menu).length .

В каком порядке перебираются свойства?

Для примера, рассмотрим объект, который задаёт список опций для выбора страны:

Здесь мы предполагаем, что большинство посетителей из России, и поэтому начинаем с 7 , это зависит от проекта.

При выборе телефонного кода мы хотели бы предлагать варианты, начиная с первого. Обычно на основе списка генерируется select , но здесь нам важно не это, а важно другое.

Правда ли, что при переборе for(key in codes) ключи key будут перечислены именно в том порядке, в котором заданы?

По стандарту – нет. Но некоторое соглашение об этом, всё же, есть.

Соглашение говорит, что если имя свойства – нечисловая строка, то такие ключи всегда перебираются в том же порядке, в каком присваивались. Так получилось по историческим причинам и изменить это сложно: поломается много готового кода.

С другой стороны, если имя свойства – число или числовая строка, то все современные браузеры сортируют такие свойства в целях внутренней оптимизации.

К примеру, рассмотрим объект с заведомо нечисловыми свойствами:

А теперь – что будет, если перебрать объект с кодами?

Читайте также:  Роутер tp link n300 инструкция

При запуске этого кода в современном браузере мы увидим, что на первое место попал код США!

Нарушение порядка возникло, потому что ключи численные. Интерпретатор JavaScript видит, что строка на самом деле является числом и преобразует ключ в немного другой внутренний формат. Дополнительным эффектом внутренних оптимизаций является сортировка.

А что, если мы хотим, чтобы порядок был именно таким, какой мы задали?

Это возможно. Можно применить небольшой хак, который заключается в том, чтобы сделать все ключи нечисловыми, например, добавим в начало дополнительный символ ‘+’ :

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

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

19 ответов

сделать это в любой ES5-совместимой среде, такой как узел, Chrome, IE 9+, FF 4+ или Safari 5+:

Вы можете использовать этот код:

тогда вы можете использовать это и в старых браузерах:

Если вы используете подчеркивания.js можно использовать _.размер (спасибо @douwe):
_.size(obj)

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

в противном случае я поддерживаю ответ @Avi. Я отредактировал его, чтобы добавить ссылка на документ MDC, который включает метод keys (), который вы можете добавить в браузеры, отличные от ECMA5.

реализация стандартного объекта (ES5.1 внутренние свойства и методы объекта) не требует Object чтобы отслеживать его количество ключей / свойств, поэтому не должно быть стандартного способа определить размер Object без явного или неявного перебора его ключей.

Итак, вот наиболее часто используемые варианты:

1. Объекта в ECMAScript.keys ()

Object.keys(obj).length; произведения внутри итерация по ключам для вычисления временного массива и возвращает его длину.

  • плюсы — читаемый и чистый синтаксис. Не требуется библиотека или пользовательский код, кроме прокладки, если собственная поддержка недоступна
  • минусы — накладные расходы памяти из-за создания массива.

2. Библиотечные решения

многие примеры на основе библиотеки в другом месте этого раздела являются полезными идиомами в контексте их библиотека. Однако с точки зрения производительности нет ничего полезного по сравнению с идеальным кодом без библиотеки, поскольку все эти методы библиотеки фактически инкапсулируют либо for-loop, либо ES5 Object.keys (родной или shimmed).

Читайте также:  Почему добавляют в черный список в одноклассниках

3. Оптимизация for-loop

на медленная часть такого for-loop обычно является .hasOwnProperty() вызов, из-за функции вызова накладных расходов. Поэтому, когда мне просто нужно количество записей объекта JSON, я просто пропускаю .hasOwnProperty() позвоните, если я знаю, что код не сделал и не будет расширяться Object.prototype .

в противном случае, ваш код может быть слегка оптимизирован путем внесения k локальные ( var k ) и с помощью оператора префикс-инкремент ( ++count ), а не постфикс.

другая идея основана на кэшировании hasOwnProperty способ:

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

Если вы действительно столкнулись с проблемой производительности, я бы предложил обернуть вызовы, которые добавляют / удаляют свойства в / из объекта с помощью функции, которая также увеличивает / уменьшает соответствующее имя (размер?) свойство.

вам нужно только вычислить начальное количество свойств один раз и двигаться дальше. Если нет реальной проблемы с производительностью, не беспокойтесь. Просто оберните этот бит кода в функцию getNumberOfProperties(object) и покончим с этим.

Я не знаю, как это сделать, однако, чтобы свести итерации к минимуму, вы можете попробовать проверить наличие __count__ и если он не существует (т. е. не Firefox), то вы можете перебирать объект и определять его для последующего использования, например:

таким образом, любой браузер, поддерживающий __count__ будет использовать это, и итерации будут выполняться только для тех, которые этого не делают. Если счет меняется, и вы не можете этого сделать, вы всегда можете сделать это функция:

этот путь в любое время вы ссылаетесь myobj. __count__ функция будет срабатывать и пересчитывать.

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

как заявил здесь это имеет ту же поддержку браузера, что и Object.keys

однако в большинстве случаев вы не захотите включать в этот тип nonenumerables операций, но всегда хорошо знать разницу 😉

Читайте также:  Iphone не делится геопозицией

для итерации на объекте ответа avi Flax.ключи(объект).длина верна для объекта, который не имеет привязанных к нему функций

шаги, чтобы избежать этого:

не помещайте функции в объект, который вы хотите подсчитать количество ключей в

используйте отдельный объект или создайте новый объект специально для функций (если вы хотите подсчитать, сколько функций есть в файле с помощью Object.keys(obj).length )

также Да, я использовал модуль _ или подчеркивания из nodejs в моем примере

документацию можно найти здесь http://underscorejs.org/ а также его источник на github и различные другие данные

для тех, у кого есть подчеркивание.js, включенный в их проект, вы можете сделать:

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

Способы перечисления свойств объекта

Согласно стандарта ECMAScript, есть три способа перечислить все свойства объекта т.е. получить их список:

  • for. in – перечисление будет включать в себя все свойства, в том числе функции и свойства прототипов;
  • Object.keys() – возвращает массив имен собственных перечисляемых свойств объекта (свойства из цепочки прототипов, не войдут в массив);
  • Object.getOwnPropertyNames() – возвращает массив содержащий все имена собственных (перечисляемых и неперечисляемых) свойств объекта.

for. in

Цикл for. in используется для перебора всех свойств из объекта в случайном порядке и имеет следующий синтаксис:

В качестве nеременной (variable) можно подставить имя переменной или инструкцию var, объявляющую одну переменную. Переменной перед началом каждой итерации цикла присваивается в виде строки имя одного из свойств объекта. Как и в цикле for, оператор var здесь не обязателен, но его рекомендуется использовать, чтобы переменная была локальной. Справа от ключевого слова in указывается объект, свойства которого будут перебираться циклом. Если переменная, представляющая объект, будет иметь значение null или undefined цикл не выполнится ни разу. И как обычно, инструкция – это инструкция или блок инструкций, образующих тело цикла.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.