Дополнительно
Как эффективно подсчитать количество ключей/свойств объекта в JavaScript?
Какой самый быстрый способ подсчитать количество ключей/свойств объекта? Можно ли это сделать без итерации над объектом? Т.е. не делая
var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;
(Firefox предоставлял волшебное свойство __count__
, но оно было удалено где-то в четвертой версии).
1444
20
Для этого в любом в ES5-совместимая среда, например, узел, хром, IE 9+ и выше, Firefox 4+, Safari или 5+:
Вы можете использовать этот код:
Затем вы можете использовать это в старых браузерах, а также:
Если вы используете Underscore.js вы можете использовать _.размер (спасибо @его Douwe):
_.размер(в obj)
В качестве альтернативы вы можете также использовать _.ключи что может быть понятнее для некоторых: `_.ключи(объект).длина
Я настоятельно рекомендую подчеркнуть, ее плотный библиотеки делают много элементарных вещей. По возможности они соответствовали ECMA5 и прислушивайтесь к собственной реализации.
В противном случае я поддерживаю @Ави'ы ответ. Я редактировал его, чтобы добавить ссылку в ЛДЦ док, который включает в себя ключи() способ вы можете добавить не ECMA5 браузерах.
Стандартная реализация объекта (в ES5.1 объект внутренних свойств и методов) не требует
объект
, чтобы отслеживать его количество ключей/свойства, поэтому не должно быть никакого стандартного способа определить размер "объекта" без явно или неявно перебора ключей.Итак, вот наиболее часто используемые варианты:
в
1. В ECMAScript's объекта.ключи()
Объект.ключи(объект).длина;
работ внутренне перебирать ключи, чтобы вычислить временный массив и возвращает его длину.2. Решения на базе библиотек
Многие библиотеки на основе примеров других в этом разделе находятся полезные идиомы в контексте их библиотека. С точки зрения производительности, однако, нет ничего, чтобы получить, по сравнению с идеальным нет-код библиотеки, так как все эти методы на самом деле инкапсулировать либо цикл for или объекта в ES5
.ключи
(родной или обертке).3. Оптимизировать цикл for
В медленная часть такого цикла вообще
.метод hasOwnProperty()
вызов из-за вызова функции накладных расходов. Поэтому, когда я просто хотите, чтобы количество записей из объекта JSON, я просто пропустить.вызов метода hasOwnProperty()
если я знаю, что никакой код не будет распространяться объект.прототип`.В противном случае, ваш код может быть слегка оптимизирован, что делает " к " местного (
ВАР K
) и с помощью префикса-инкремент оператор (граф++
), а не постфикс.Очередная идея основывается на кэшировании
метод hasOwnProperty
метод:Будет ли это быстрее или нет на данной среды является вопрос бенчмаркинга. Очень ограниченный выигрыш в производительности может быть в любом случае ожидается.
Если вы действительно столкнулись с проблемой производительности, я бы предложил обернуть вызовы, добавляющие/удаляющие свойства объекта, функцией, которая также увеличивает/уменьшает соответствующим образом названное свойство (размер?).
Вам нужно только один раз вычислить начальное количество свойств и двигаться дальше. Если нет реальной проблемы с производительностью, не беспокойтесь. Просто оберните этот кусок кода в функцию
getNumberOfProperties(object)
и покончите с этим.Я не знаю, как это сделать, однако, чтобы свести количество итераций к минимуму, вы можете попробовать проверить существование
__count__
и если его не существует (т.е. не Firefox), то вы можете выполнить итерации над объектом и определить его для дальнейшего использования, например:Таким образом, любой браузер, поддерживающий
__count__
, будет использовать его, а итерации будут выполняться только для тех, которые его не поддерживают. Если счетчик меняется и вы не можете этого сделать, вы всегда можете сделать его функцией:Таким образом, при каждом обращении к myobj.
__count__
функция будет срабатывать и пересчитывать.Как заявил Ави лен https://stackoverflow.com/a/4889658/1047014
будет делать трюк для всех перечислимых свойств объекта, но также включают в себя неперечислимый свойства можно использовать объект.getOwnPropertyNames`. Здесь's разница:
Как сказано здесь это имеет такое же поддержка браузеров как объект.ключи`
Однако, в большинстве случаев, вы не могли бы хотеть включать nonenumerables в подобных операциях, но это's всегда хорошо, чтобы знать разницу ;)
Для прохода на avi объекта ответа льна.ключи(объект).длина является правильным для объекта, который не имеет функции привязаны к нему
пример:
против
шаги, чтобы избежать этого:
не ставьте функции в объект, который вы хотите посчитать количество ключей в
использовать отдельный объект или сделать новый объект специально для функции (если вы хотите, чтобы подсчитать, сколько функций есть в файл, используя объект.ключи(объект).длина`)
и да я использовал _ или подчеркивания модуль с nodejs в моем примере
документацию можно найти здесь http://underscorejs.org/ а также ее исходный код на GitHub и различные другие данные
И, наконец, реализация лодашь https://lodash.com/docs#size
_.размер(в obj)
как Ответил выше: `объект.ключи(объект).длина
Но: как у нас теперь есть карта класс в ЕС6, я бы предлагаю, чтобы использовать ее вместо использования свойства объекта.
Для тех, кто Underscore.js включили в свой проект вы можете сделать:
или функционального стиля:
От: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
Вы можете либо добавить его в всех ваших объектов:
Или один объект:
Пример:
Добавила, что, кстати, он выиграл'т быть отображены в..в циклах:
Выход:
Примечание: это не работает в < ИЕ9 браузерах.
Как я'вэ решил эту проблему-построить свою собственную реализацию основной список, который ведет учет, сколько элементов хранится в объекте. Его очень простой. Что-то вроде этого:
Вы можете использовать объект.ключи(данных).длина Найдите длину JSON-объект, имеющий ключевые данные
Для тех, кто доб помощью JS 4 в свой проект вы можете сделать:
Преимуществом этого является то, что она'будете работать на всех совместимых браузерах доб (ИЕ6-ИЕ8 в комплекте), однако, я считаю, что время ничуть не лучше, чем o(n) времени, хотя, как и в других предложенных решений.
ОП не'т указать, является ли объект узла, если это так, то вы можете просто использовать длина метод напрямую. Пример:
Если выше jQuery не работает, то попробуйте
Вот некоторые тесты производительности для трех методов;
https://jsperf.com/get-the-number-of-keys-in-an-object
Объект##.ключи().длина
20,735 операций в секунду
Очень простой и совместимый. Работает быстро but дорого, потому что он создает новый массив ключей, который затем выбрасывается.
возвращаемый объект.ключи(objectToRead).длина;
петлю через ключи
15,734 операций в секунду
пусть размер=0; для(Пусть K в objectToRead) { размер++ } размер возврата;
Немного медленнее, но близко к памяти, так что, наверное, лучше, если вы'повторно заинтересованы в оптимизации для мобильного или других небольших машин
Используя карту вместо объекта
953,839,338 операций в секунду
возвращение mapToRead.размер;
В принципе, карта следы его собственного размера, так что мы'вновь возвращается в поле Номер. Гораздо быстрее, чем любой другой метод. Если у вас есть контроль над объектом, а не конвертировать их в карты.
Вы можете использовать:
и
Я стараюсь сделать его доступным для всех объект такой:
Я не думаю, что это возможно (по крайней мере, без использования некоторых внутренних компонентов). И я не думаю, что вы много выиграете, оптимизируя это.