У меня есть объект JavaScript, есть ли встроенный или общепринятый способ получения длины этого объекта?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
javascript
javascript-objects
Гарет Симпсон
источник
источник
Object.keys(obj).length
Ответы:
Самый надежный ответ (то есть, который отражает намерение того, что вы пытаетесь сделать, вызывая при этом наименьшее количество ошибок):
В JavaScript есть своего рода соглашение, что вы не добавляете вещи в Object.prototype , потому что он может нарушать перечисления в различных библиотеках. Однако добавление методов в Object обычно безопасно.
Вот обновление от 2016 года и широкое развертывание ES5 и более поздних версий . Для IE9 + и всех других современных браузеров с поддержкой ES5 + вы можете использовать следующий
Object.keys()
код:Это не должно изменять любой существующий прототип, так
Object.keys()
как теперь встроен.Редактировать : Объекты могут иметь символические свойства, которые нельзя вернуть с помощью метода Object.key. Таким образом, ответ будет неполным без упоминания их.
Тип символа был добавлен в язык для создания уникальных идентификаторов свойств объекта. Основным преимуществом типа Symbol является предотвращение перезаписи.
Object.keys
илиObject.getOwnPropertyNames
не работает для символических свойств. Чтобы вернуть их вам нужно использоватьObject.getOwnPropertySymbols
.источник
Object.keys(obj).length
Если вы знаете, что вам не нужно беспокоиться о
hasOwnProperty
проверках, вы можете сделать это очень просто:источник
Обновлено : если вы используете Underscore.js (рекомендуется, он легкий!), То вы можете просто сделать
Если нет , и вы не хотите возиться со свойствами объекта по какой-либо причине и уже используете jQuery, плагин одинаково доступен:
источник
_.size()
было идеальным решением для моего проекта Meteor , поддерживающего underscore.js.Вот самое кросс-браузерное решение.
Это лучше, чем принятый ответ, потому что он использует нативный Object.keys, если существует. Таким образом, это самый быстрый для всех современных браузеров.
источник
Object.keys()
возвращает массив, содержащий имена только тех свойств, которые являются перечисляемыми. Если вам нужен массив со ВСЕМИ свойствами, вы должны использоватьObject.getOwnPropertyNames()
вместо этого. См developer.mozilla.org/en/docs/Web/JavaScript/Reference/...Я не эксперт по JavaScript, но похоже, что вам придется циклически проходить по элементам и считать их, поскольку у Object нет метода length:
@palmsey: справедливо для OP, документация JavaScript фактически явно ссылается на использование переменных типа Object таким образом, как «ассоциативные массивы».
источник
Этот метод получает все имена свойств вашего объекта в массиве, поэтому вы можете получить длину этого массива, равную длине ключей вашего объекта.
источник
Чтобы не связываться с прототипом или другим кодом, вы можете создать и расширить свой собственный объект:
Если вы всегда используете метод add, свойство length будет правильным. Если вы беспокоитесь о том, что вы или другие забыли об его использовании, вы можете добавить счетчик свойств, который другие опубликовали, также в методе length.
Конечно, вы всегда можете переписать методы. Но даже если вы это сделаете, ваш код, вероятно, заметно потерпит неудачу, упрощая отладку. ;)
источник
Вот как и не забудьте проверить, что свойство не входит в цепочку прототипов:
источник
Просто используйте это, чтобы получить
length
:источник
myArray
Это совершенно другое решение, которое будет работать только в более современных браузерах (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+).
Смотрите jsFiddle
Настройте свой ассоциативный класс Array
Теперь вы можете использовать этот код следующим образом ...
источник
length
свойство, любой код, который использовал его, должен был бы гарантировать, что оно не будет пытаться сохранить егоlength
, но я думаю, что это было бы то же самое, если бы оно было стандартный массив тоже. ПереопределениеhasOwnProperty
любого объекта, скорее всего, приведет к нежелательному результату.Это работает для меня:
источник
В некоторых случаях лучше просто сохранить размер в отдельной переменной. Особенно, если вы добавляете в массив по одному элементу в одном месте и можете легко увеличивать размер. Очевидно, это будет работать намного быстрее, если вам нужно часто проверять размер.
источник
Использование:
источник
И, честно говоря, @palmsey он был совершенно прав: они не ассоциативные массивы, а определенно объекты :) - выполняющие работу ассоциативного массива. Но что касается более широкой темы, вы определенно имеете на это право в соответствии с этой довольно хорошей статьей, которую я нашел:
JavaScript «Ассоциативные массивы» считается вредным
Но в соответствии с этим, не является ли принятый ответ самой плохой практикой?
Если что-то еще было добавлено в Object .prototype, то предложенный код завершится ошибкой:
Я не думаю, что ответ должен быть принят, так как ему нельзя доверять, если у вас есть другой код, работающий в том же контексте выполнения. Чтобы сделать это надежным способом, вам наверняка понадобится определить метод size в myArray и проверять тип членов при их итерации по ним.
источник
Если вам нужна ассоциативная структура данных, которая показывает ее размер, лучше использовать карту вместо объекта.
источник
Как насчет чего-то вроде этого -
источник
Если у нас есть хэш
мы можем получить длину, используя длину ключей, которая является длиной хеша:
источник
источник
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
Если вы используете AngularJS 1.x, вы можете делать вещи AngularJS путем создания фильтра и использования кода из любого другого примера, такого как:
Применение
В вашем контроллере:
Или по вашему мнению:
источник
Самый простой способ такой
где myobject - это объект того, что вы хотите, чтобы длина
источник
Если вам не нужна поддержка Internet Explorer 8 или ниже, вы можете легко получить количество свойств в объекте, выполнив следующие два шага:
Object.keys()
для получения массива, содержащего имена только тех свойств, которые являются перечисляемыми, либо,Object.getOwnPropertyNames()
если вы хотите также включить имена свойств, которые не перечислимы..length
свойство этого массива.Если вам нужно сделать это более одного раза, вы можете заключить эту логику в функцию:
Как использовать эту функцию:
Смотрите также эту скрипку для демонстрации.
источник
Используйте,
Object.keys(myObject).length
чтобы получить длину объекта / массиваисточник
источник
Вариация некоторых из вышеперечисленных:
Это немного более элегантный способ интеграции hasOwnProp.
источник
Вот другая версия ответа Джеймса Когана. Вместо передачи аргумента просто создайте прототип класса Object и сделайте код чище.
Пример jsfiddle: http://jsfiddle.net/qar4j/1/
источник
Object.prototype
- плохая идея.Вы можете просто использовать
Object.keys(obj).length
любой объект, чтобы получить его длину. Object.keys возвращает массив, содержащий все ключи объекта (свойства), которые могут пригодиться для определения длины этого объекта по длине соответствующего массива. Вы даже можете написать функцию для этого. Давайте проявим творческий подход и напишем для него метод (вместе с более удобным свойством getter):источник
Вы всегда можете сделать так,
Object.getOwnPropertyNames(myObject).length
чтобы получить тот же результат,[].length
что и для обычного массива.источник
Object.keys()
возвращает массив, содержащий имена только тех свойств, которые являются перечисляемыми. Если вам нужен массив со ВСЕМИ свойствами, вы должны использоватьObject.getOwnPropertyNames()
вместо этого. См developer.mozilla.org/en/docs/Web/JavaScript/Reference/...Мы можем найти длину объекта с помощью:
источник
Немного опоздал к игре, но хороший способ добиться этого (только для IE9 +) - определить магический метод получения свойства length:
И вы можете просто использовать его так:
Дал бы
1
.источник
Ниже приведена версия ответа Джеймса Коглана в CoffeeScript для тех, кто отказался от прямого JavaScript :)
источник
size++ for own key of obj
(own key
синтаксис сахара в CoffeeScript). ИспользованиеhasOwnProperty
непосредственно из объекта опасно, поскольку оно нарушается, когда объект действительно обладает таким свойством.