У меня есть объект JavaScript. Есть ли встроенный или принятый наилучший способ получить длину этого объекта?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
Добавлен однострочный файл в Underscore.js, который делает это: stackoverflow.com/a/11346637/11236
После строчного ответа используйте Object.keys (myArray) .length, как сказал @aeosynth.
@neitony - это отчасти правда, но так много людей привыкли к «ассоциативному массиву» PHP, что они могут предположить, что он означает «ассоциативная карта упорядоченный», когда объекты JS фактически неупорядочены.
ммм в хроме, может быть, больше, я могу использовать Object.getLength(obj), не знаю, откуда он ... вероятно, jquery
хорошо, как насчет Object.keys(obj).length
«В JavaScript нет ассоциативных массивов - в нем есть только объекты, которые можно использовать как понятие ассоциативных массивов». Есть разница, которая затронула одну из моих систем - ассоциативные массивы ([]) имеют встроенное свойство «длина», что означает, что вы должны следить за ним при добавлении динамических ключей. У объектов ({}) этой проблемы нет.
Почему недопустимый объект object.length? Он возвращает правильный результат для меня.
сравнение производительности: jsben.ch/#/oSt2p
Возможный дубликат Как получить длину объекта
В приведенном выше примере myObject.length не определено, по крайней мере, в среде браузера. Вот почему это недействительно, @AdrianM
попробуйте этот Object.keys(myObject).length



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не эксперт по JavaScript, но похоже, что вам придется перебирать элементы и подсчитывать их, поскольку у объекта нет метода длины:
var element_count = 0;
for (e in myArray) { if (myArray.hasOwnProperty(e)) element_count++; }
@palmsey: Справедливости ради, документация JavaScript фактически явно ссылается на использование переменных типа Object таким образом как «ассоциативные массивы».
Не сработает, потому что учитываются и методы, добавленные через прототип.
Вот как это сделать, и не забудьте проверить, что это свойство не входит в цепочку прототипов:
var element_count = 0;
for(var e in myArray)
if (myArray.hasOwnProperty(e))
element_count++;
@palmsey: In fairness to the OP, the JavaScript documentation actually explicitly refer to using variables of type Object in this manner as "associative arrays".
И, честно говоря, @palmsey он был совершенно прав. Это не ассоциативные массивы; они определенно объекты :) - они выполняют работу ассоциативного массива. Но что касается более широкой точки зрения, вы определенно имеете на это право, согласно этой довольно хорошей статье, которую я нашел:
«Ассоциативные массивы» JavaScript считаются вредными
Но, судя по всему, принятый ответ сам по себе плохая практика?
Specify a prototype size() function for Object
Если что-то еще было добавлено в Object .prototype, предложенный код не будет работать:
<script type = "text/javascript">
Object.prototype.size = function () {
var len = this.length ? --this.length : -1;
for (var k in this)
len++;
return len;
}
Object.prototype.size2 = function () {
var len = this.length ? --this.length : -1;
for (var k in this)
len++;
return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>
Я не думаю, что этот ответ должен быть принятым, поскольку ему нельзя доверять, если у вас есть какой-либо другой код, работающий в том же контексте выполнения. Чтобы сделать это надежным образом, вам, безусловно, нужно будет определить метод размера в myArray и проверять тип членов при их итерации.
Наиболее надежным ответом (т. Е. Отражающим намерение того, что вы пытаетесь сделать, вызывая наименьшее количество ошибок) будет:
Object.size = function(obj) {
var size = 0,
key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
// Get the size of an object
const myObj = {}
var size = Object.size(myObj);В JavaScript есть своего рода соглашение о том, что вы не добавляйте вещи в Object.prototype, потому что это может нарушить перечисления в различных библиотеках. Однако добавление методов в Object обычно безопасно.
Вот обновление по состоянию на 2016 год, повсеместное развертывание ES5 и далее. Для IE9 + и всех других современных браузеров, поддерживающих ES5 +, вы можете использовать Object.keys(), поэтому приведенный выше код будет выглядеть следующим образом:
var size = Object.keys(myObj).length;
При этом не нужно изменять какой-либо существующий прототип, так как Object.keys() теперь встроен.
Редактировать: объекты могут иметь символьные свойства, которые не могут быть возвращены с помощью метода Object.key. Так что ответ был бы неполным без их упоминания.
В язык был добавлен тип символа для создания уникальных идентификаторов свойств объекта. Основное преимущество типа символа - предотвращение перезаписи.
Object.keys или Object.getOwnPropertyNames не работают для символьных свойств. Для их возврата нужно использовать Object.getOwnPropertySymbols.
var person = {
[Symbol('name')]: 'John Doe',
[Symbol('age')]: 33,
"occupation": "Programmer"
};
const propOwn = Object.getOwnPropertyNames(person);
console.info(propOwn.length); // 1
let propSymb = Object.getOwnPropertySymbols(person);
console.info(propSymb.length); // 2@Tres - ваш код может быть взломан, если кто-то придет и отменит свойство 'size', не зная, что вы уже объявили его где-то в коде, поэтому всегда стоит проверять, определено ли оно уже
@vsync Вы очень правы. Всегда нужно проводить необходимые проверки работоспособности :)
Я обернул этот ответ как плагин jQuery для тех, кто не любит возиться с Object: stackoverflow.com/a/11346637/11236
@James Coglan, почему вы объявляете функцию в классе Object, а не просто как обычную функцию? т.е. функция getSize (obj) {...}?
@alexserver Я думаю, он просто поддерживает правильную структуру. Эта функция возвращает размер объекта, поэтому имеет смысл сделать его расширением Object. Держите свой код чистым и удобным в обслуживании.
Однако этот метод более ошибочен, особенно когда hasownprop редко сбрасывается при удалении ключей объекта с помощью ключевого слова delete.
Почему все это игнорируют: Object.keys(obj).length
@MuhammadUmer Возможно, потому что этого метода даже не существовало, когда был написан этот ответ. Даже сегодня для его использования, вероятно, потребуется полифилл для старых браузеров.
Re Object.keys (obj) .length: это потому, что IE8 не поддерживает этот метод.
@stonyau IE8, IE9, IE10 - мертвые браузеры, которые не получают поддержки от Microsoft. Пользователи IE8, IE9, IE10 получают уведомление от Microsoft о том, что они используют старый неподдерживаемый браузер и должны ожидать, что у них ничего не получится. support.microsoft.com/en-us/kb/3123303
Да, это 2017 год. Никто не должен использовать ничего, кроме Object.keys(myObj).length. Этот ответ был правильным в 2008 году, но не сейчас.
Не уверен, что это уже упоминалось, потому что TL; DR, но расширение встроенных объектов JavaScript не одобряется.
Ни функции Object.keys(), ни функции getOwnProperty*() не дадут вам правильный ответ, если их параметр будет new Date(), который, конечно же, является объектом (typeof new Date() === 'object'). Странно…
@ Przemek Я не понимаю, о чем вы. Object.keys(new Date()).length дает 0, x = new Date(); Object.keys(x).length также дает 0.
Это происходит потому, что ни одно из свойств Date не является перечислимым. Например: Object.getOwnPropertyDescriptor(new Date().__proto__, 'getDay')
Мне нравится, что "вызывает наименьшее количество ошибок"
Если вы знаете, что вам не нужно беспокоиться о проверках hasOwnProperty, вы можете сделать это очень просто:
Object.keys(myArray).length
почему нет? насколько я знаю, это стандарт: developer.mozilla.org/en/JavaScript/Reference/Global_Objects /…
Это не универсальный метод реализовано, но вы можете проверить, какой браузер поддерживает его, с помощью этот стол.
@ ripper234 Это зависит от ваших требований.
Согласно этой таблице IE8 поддерживает 4/34 «стандартов». Вау.
время переключиться на firefox = к сожалению, вы переходите не означает, что пользователи вашего сайта будут ...
@ ripper234 нет поддержки IE = время до полифил
if (typeof Object.keys != 'function') { Object.keys = function(obj) { var ret = []; for (var x in obj) { if (obj.hasOwnProperty(x)) { ret[ret.length] = x; } } return ret; } }
По крайней мере, он работает на стороне сервера node.js :) Спасибо за этот ответ.
@ ripper234: нет IE8, Object.keys or= (obj) -> key for own key of obj (CoffeeScript, вы можете легко скопировать сгенерированный вывод).
@ ripper234, кому небезразличен IE, никого не должны волновать нестандартности IE, только стандарты. пользователи хотят использовать IE, тогда они не будут перемещаться по моему сайту, меня это больше не волнует. разработчики не должны использовать полифиллы, а не стандарты, разработанные, например, "разработчиками"
создание нового массива только для того, чтобы подсчитать его длину? Это переизбыток ресурсов
В спецификации сказано, что метод keys () возвращает только имена собственных свойств объекта, поэтому использование этого метода позволит избежать проверки hasOwnProperty.
@SteelBrain - не оптимизируйте преждевременно. Если вам нужно сохранить ресурсы, я бы рекомендовал сохранить отдельную переменную длины (или использовать цикл for), но это, вероятно, необходимо только при работе с огромными хешами.
@albanx Такое отношение не продвинет вас далеко в веб-разработке. Сайты созданы для посетителей, а не для разработчиков.
Отличный полифил для устаревшего IE по адресу: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
map создает массив той же длины. Вы имели в виду filter?
Даже если вы беспокоитесь о функциях .hasOwnProperty*(), вы не получите правильного ответа, если бы объект, который вы хотели проверить, был new Date().
Если вас беспокоит скорость, оказывается, что Object.values(myObject).length быстрее. По крайней мере, в Chrome v67. gist.github.com/flekschas/5aad97d1c2520db7af0a9623deec005f
Нет поддержки IE? Получите лучший браузер.
Чтобы не связываться с прототипом или другим кодом, вы можете создать и расширить свой собственный объект:
function Hash(){
var length=0;
this.add = function(key, val){
if (this[key] == undefined)
{
length++;
}
this[key]=val;
};
this.length = function(){
return length;
};
}
myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2
Если вы всегда используете метод добавления, свойство length будет правильным. Если вас беспокоит, что вы или другие забудете об его использовании, вы также можете добавить счетчик свойств, опубликованный другими, в метод length.
Конечно, вы всегда можете перезаписать методы. Но даже если вы это сделаете, ваш код, вероятно, выйдет из строя, что упростит отладку. ;)
Я думаю, что это лучшее решение, поскольку оно не требует цикла с 'for', что может быть дорогостоящим, если массив большой.
В некоторых случаях лучше просто сохранить размер в отдельной переменной. Особенно, если вы добавляете в массив по одному элементу в одном месте и можете легко увеличить размер. Очевидно, это сработало бы намного быстрее, если бы вам нужно было часто проверять размер.
А как насчет этого -
function keyValuePairs() {
this.length = 0;
function add(key, value) { this[key] = value; this.length++; }
function remove(key) { if (this.hasOwnProperty(key)) { delete this[key]; this.length--; }}
}
Вариантом некоторых из вышеперечисленных является:
var objLength = function(obj){
var key,len=0;
for(key in obj){
len += Number( obj.hasOwnProperty(key) );
}
return len;
};
Это более элегантный способ интеграции hasOwnProp.
Обновлено: Если вы используете Underscore.js (рекомендуется, он легкий!), То вы можете просто сделать
_.size({one : 1, two : 2, three : 3});
=> 3
Если не, и вы не хотите возиться со свойствами объекта по какой-либо причине, и вы уже используете jQuery, плагин также доступен:
$.assocArraySize = function(obj) {
// http://stackoverflow.com/a/6700/11236
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
_.size() был идеальным решением для моего проекта Метеор, который поддерживает underscore.js.
Я использую подчеркивание, и этот пост просто напомнил мне, что я использую его недостаточно в этом проекте. Если вы работаете с объектами, у вас должен быть доступен файл underscore.js.
Подчеркивание> (все - ['lo-dash'])
underscorejs, то, что должно быть в js :)
Вопрос: Почему в цикле используется дополнительный оператор if?
@Babydead, чтобы отличать реальные свойства объекта от унаследованных. developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Ниже представлена версия ответа Джеймса Коглана на CoffeeScript для тех, кто отказался от прямого JavaScript :)
Object.size = (obj) ->
size = 0
size++ for own key of obj
size
Вы, вероятно, хотели сказать size++ for own key of obj (own key является синтаксическим сахаром в CoffeeScript). Использование hasOwnProperty непосредственно из объекта опасно, поскольку оно ломается, когда объект действительно имеет такое свойство.
OP не запрашивал версию CoffeeScript, и она не помечена как таковая. Это неверный ответ на вопрос.
Вот другая версия ответа Джеймса Когана. Вместо передачи аргумента просто создайте прототип класса Object и сделайте код более чистым.
Object.prototype.size = function () {
var size = 0,
key;
for (key in this) {
if (this.hasOwnProperty(key)) size++;
}
return size;
};
var x = {
one: 1,
two: 2,
three: 3
};
x.size() === 3;
Пример jsfiddle: http://jsfiddle.net/qar4j/1/
Object.prototype - плохая идея.
@tborychowski, пожалуйста, объясните почему?
вот одна статья: bit.ly/1droWrG. Я не говорю, что этого нельзя делать, просто вам нужно знать все последствия, прежде чем это делать.
Если вы собираетесь расширить встроенные прототипы или заполнить свойство (например, обезьяна-патч), сделайте это правильно: для прямой совместимости сначала проверьте, существует ли свойство, а затем сделайте свойство неперечисляемым, чтобы собственные ключи построенных объектов не загрязнены. Для методов используйте действительныйметоды. Моя рекомендация: следуйте эти примеры, который демонстрирует, как добавить метод, который ведет себя как можно ближе к встроенным методам.
Вот совершенно другое решение, которое будет работать только в более современных браузерах (Internet Explorer 9+, Chrome, Firefox 4+, Opera 11.60+ и Safari 5.1+).
См. этот jsFiddle.
Настройте свой класс ассоциативного массива
/**
* @constructor
*/
AssociativeArray = function () {};
// Make the length property work
Object.defineProperty(AssociativeArray.prototype, "length", {
get: function () {
var count = 0;
for (var key in this) {
if (this.hasOwnProperty(key))
count++;
}
return count;
}
});
Теперь вы можете использовать этот код следующим образом ...
var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);
Я считаю, что это небезопасно. Например, у него не может быть элемента с ключом «длина», утверждение a1 [«length»] = «Hello world»; не может сохранить запись. Также утверждение a1 ["hasOwnProperty"] = "некоторая опора"; полностью нарушает функцию
@PanosTheof Я не думаю, что вы хотели бы, чтобы он сохранял значение, если вы использовали свойство length, любой код, который его использовал, должен был бы гарантировать, что он не пытался сохранить значение для length, но я думаю, что это было бы то же самое, если это тоже был стандартный массив. Переопределение hasOwnProperty для любого объекта, скорее всего, приведет к нежелательному результату.
Вот самое кроссбраузерное решение.
Это лучше, чем принятый ответ, потому что он использует собственный Object.keys, если он существует. Таким образом, это самый быстрый из всех современных браузеров.
if (!Object.keys) {
Object.keys = function (obj) {
var arr = [],
key;
for (key in obj) {
if (obj.hasOwnProperty(key)) {
arr.push(key);
}
}
return arr;
};
}
Object.keys(obj).length;
Object.keys() возвращает массив, содержащий имена только тех свойств, которые можно перечислить. Если вам нужен массив со ВСЕМИ свойствами, вам следует использовать Object.getOwnPropertyNames(). См. developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Если у нас есть хеш
hash = {"a" : "b", "c": "d"};
мы можем получить длину, используя длину ключей, которая является длиной хеша:
keys(hash).length
Это отличный ответ, однако я не могу найти никакой документации для этой функции клавиш. Так что я не могу быть уверен в кроссбраузерной поддержке.
К сожалению, это не такой хороший ответ, как я сначала подумал! Оказывается, функция клавиш доступна только в веб-консолях Chrome и Firefox. Если вы поместите этот код в скрипт, он завершится с ошибкой Uncaught ReferenceError: ключи не определены
Чем это отличается от ответ aeosynth?
Как и у большинства проблем с JavaScript, существует множество решений. Вы можете расширить Объект, который лучше или хуже работает, как Словарь многих других языков (+ граждане первого класса). В этом нет ничего плохого, но другой вариант - создать новый объект, отвечающий вашим конкретным потребностям.
function uberject(obj){
this._count = 0;
for(var param in obj){
this[param] = obj[param];
this._count++;
}
}
uberject.prototype.getLength = function(){
return this._count;
};
var foo = new uberject({bar:123,baz:456});
alert(foo.getLength());
не модифицируйте прототип :)
Изменение прототипа фабричной функции - это способ их расширения.
Этот метод получает все имена свойств вашего объекта в массиве, поэтому вы можете получить длину этого массива, равную длине ключей вашего объекта.
Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2
Метод ключей @PatrickRoberts не возвращает свойства из цепочки прототипов. Итак, зачем нужен hasOwnProperty здесь. Также getOwnProperty вернет скрытые свойства, так как длина находится в массиве и т. д.
Object.defineProperty(Object.prototype, 'length', {
get: function () {
var size = 0, key;
for (key in this)
if (this.hasOwnProperty(key))
size++;
return size;
}
});
var o = {a: 1, b: 2, c: 3};
alert(o.length); // <-- 3
o['foo'] = 123;
alert(o.length); // <-- 4
Если вы собираетесь расширить встроенные прототипы или заполнить свойство (например, обезьяна-патч), сделайте это правильно: для прямой совместимости сначала проверьте, существует ли свойство, а затем сделайте свойство неперечисляемым, чтобы собственные ключи построенных объектов не загрязнены. Для методов используйте действительныйметоды. Моя рекомендация: следуйте эти примеры, который демонстрирует, как добавить метод, который ведет себя как можно ближе к встроенным методам.
Простое решение:
var myObject = {}; // ... your object goes here.
var length = 0;
for (var property in myObject) {
if (myObject.hasOwnProperty(property)){
length += 1;
}
};
console.info(length); // logs 0 in my example.
Если вы используете AngularJS 1.x, вы можете делать что-то способом AngularJS, создав фильтр и используя код из любого из других примеров, таких как следующий:
// Count the elements in an object
app.filter('lengthOfObject', function() {
return function( obj ) {
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
}
})
использование
В вашем контроллере:
$scope.filterResult = $filter('lengthOfObject')($scope.object)
Или на ваш взгляд:
<any ng-expression = "object | lengthOfObject"></any>
OP не запрашивал версию AngularJS. Это неверный ответ на вопрос.
Вы всегда можете выполнить Object.getOwnPropertyNames(myObject).length, чтобы получить тот же результат, что и [].length для обычного массива.
Object.keys() возвращает массив, содержащий имена только тех свойств, которые можно перечислить. Если вам нужен массив со ВСЕМИ свойствами, вам следует использовать Object.getOwnPropertyNames(). См. developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Чем это отличается от ответ aeosynth?
Если вам не нужна поддержка Internet Explorer 8 или более ранней версии, вы можете легко получить количество свойств в объекте, выполнив следующие два шага:
Object.keys(), чтобы получить массив, содержащий имена только тех свойств, которые являются перечислимый или Object.getOwnPropertyNames(), если вы хотите также включить имена свойств, которые не являются перечислимыми..length этого массива.Если вам нужно сделать это более одного раза, вы можете обернуть эту логику в функцию:
function size(obj, enumerablesOnly) {
return enumerablesOnly === false ?
Object.getOwnPropertyNames(obj).length :
Object.keys(obj).length;
}
Как использовать эту конкретную функцию:
var myObj = Object.create({}, {
getFoo: {},
setFoo: {}
});
myObj.Foo = 12;
var myArr = [1,2,5,4,8,15];
console.info(size(myObj)); // Output : 1
console.info(size(myObj, true)); // Output : 1
console.info(size(myObj, false)); // Output : 3
console.info(size(myArr)); // Output : 6
console.info(size(myArr, true)); // Output : 6
console.info(size(myArr, false)); // Output : 7
Если вам нужна ассоциативная структура данных, раскрывающая ее размер, лучше использовать карту вместо объекта.
const myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
console.info(myMap.size); // 3Использовать:
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.info(obj)Решение работает во многих случаях и кроссбраузерно:
Код
var getTotal = function(collection) {
var length = collection['length'];
var isArrayObject = typeof length == 'number' && length >= 0 && length <= Math.pow(2,53) - 1; // Number.MAX_SAFE_INTEGER
if (isArrayObject) {
return collection['length'];
}
i= 0;
for(var key in collection) {
if (collection.hasOwnProperty(key)) {
i++;
}
}
return i;
};
Примеры данных:
// case 1
var a = new Object();
a["firstname"] = "Gareth";
a["lastname"] = "Simpson";
a["age"] = 21;
//case 2
var b = [1,2,3];
// case 3
var c = {};
c[0] = 1;
c.two = 2;
использование
getLength(a); // 3
getLength(b); // 3
getLength(c); // 2
Вы можете просто использовать Object.keys(obj).length на любом объекте, чтобы узнать его длину. Object.keys возвращает массив, содержащий все объекты ключи (свойства), которые могут пригодиться для определения длины этого объекта с использованием длины соответствующего массива. Вы даже можете написать для этого функция. Давайте возьмем творческий и напишем для него метод (вместе с более удобным свойством геттера):
function objLength(obj)
{
return Object.keys(obj).length;
}
console.info(objLength({a:1, b:"summit", c:"nonsense"}));
// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.info(objLength(obj));
// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
return Object.keys(this).length;
}
console.info(obj.getLength());
// You can also write it as a method, which is more efficient as done so above
Object.defineProperty(Object.prototype, "length", {get:function(){
return Object.keys(this).length;
}});
console.info(obj.length);
// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()Чем это отличается от ответ aeosynth?
Это потому, что он показывает, как сделать его функцией и методом глобального объекта (более объектно-ориентированным и использует некоторую форму инкапсуляции); однако ответ aeosynth этого не делает.
Если вы собираетесь расширить встроенные прототипы или заполнить свойство (например, обезьяна-патч), сделайте это правильно: для прямой совместимости сначала проверьте, существует ли свойство, а затем сделайте свойство неперечисляемым, чтобы собственные ключи построенных объектов не загрязнены. Для методов используйте действительныйметоды. Моя рекомендация: следуйте эти примеры, который демонстрирует, как добавить метод, который ведет себя как можно ближе к встроенным методам.
Кроме того, как написание метода «более эффективно»?
Мы можем найти длину объекта, используя:
const myObject = {};
console.info(Object.values(myObject).length);Хороший способ добиться этого (только для Internet Explorer 9+) - определить волшебный получатель для свойства length:
Object.defineProperty(Object.prototype, "length", {
get: function () {
return Object.keys(this).length;
}
});
И вы можете просто использовать это так:
var myObj = { 'key': 'value' };
myObj.length;
Это дало бы 1.
Помимо аргументов против модификации прототипа, у меня лично НИКОГДА не было ошибок, вызванных этим, и для меня это одна из сильных сторон JavaScript.
Просто используйте это, чтобы получить length:
Object.keys(myObject).length
объясните, пожалуйста, чем ваш ответ отличается от stackoverflow.com/a/6700/8632727
Хорошо, всегда лучше называть переменные в соответствии с тем, что они есть на самом деле. Делает ваш код более читабельным для других разработчиков.
До редактирования «myArray» -> «myObject» это было идентично ответу, получившему второе место по количеству голосов.
То же, что и предыдущие ответы.
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
Какой из вышеперечисленных быстрее 3.
Object.values (myObject) .length
как мы можем сказать, что Object.values (myObject) .length быстрее, есть ли пример Спасибо, @tdjprog
просто попробуйте это в консоли: var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
почему Object.values (myObject) .length быстрее, где, поскольку Object.entries (myObject) .length не дает вывода даже через некоторое время, в чем причина здесь? Спасибо @tdjprog
По объяснению будет по порядку. Вы можете отредактируйте свой ответ.
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
var size = JSON.stringify(myObject).length;
document.write(size);JSON.stringify(myObject)вопрос решен вокруг количества свойств. ваш ответ просто показывает, какова длина одной (из многих!) сериализованных форм.
По объяснению будет по порядку. Вы можете отредактируйте свой ответ.
Самый простой способ такой:
Object.keys(myobject).length
Где myobject - это объект, длину которого вы хотите.
Похоже, это просто повторение этот существующий ответ.
@Pang согласился, и он не предоставляет никакого дополнительного контекста, как другие ответы.
<script>
myObj = {"key1" : "Hello", "key2" : "Goodbye"};
var size = Object.keys(myObj).length;
console.info(size);
</script>
<p id = "myObj">The number of <b>keys</b> in <b>myObj</b> are: <script>document.write(size)</script></p>Это работает для меня:
var size = Object.keys(myObj).length;
Object.keys возвращает нет правильный результат в случае объекта наследование. Для правильного подсчета свойств объекта, в том числе унаследованных, используйте for-in. Например, с помощью следующей функции (связанной вопрос):
var objLength = (o,i=0) => { for(p in o) i++; return i }
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
var child = Object.create(myObject);
child["sex"] = "male";
var objLength = (o,i=0) => { for(p in o) i++; return i }
console.info("Object.keys(myObject):", Object.keys(myObject).length, "(OK)");
console.info("Object.keys(child) :", Object.keys(child).length, "(wrong)");
console.info("objLength(child) :", objLength(child), "(OK)");У меня была аналогичная потребность в вычислении пропускной способности, используемой объектами, полученными через веб-сокет. Мне было достаточно просто найти длину Stringified объекта.
websocket.on('message', data => {
dataPerSecond += JSON.stringify(data).length;
}
Это не отвечает на вопрос.
Используйте Object.keys(myObject).length, чтобы получить длину объекта / массива
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
console.info(Object.keys(myObject).length); //3const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
console.info(Object.keys(myObject).length)
// o/p 3
Что означает "о / п 3"?
Пояснение к этому ответу было бы в порядке.
Кроме того, чем он отличается от предыдущих ответов, например ответ шахеба?
С помощью встроенного объекта Reflect в ECMAScript 6 вы можете легко подсчитать свойства объекта:
Reflect.ownKeys(targetObject).length
Это даст вам длину собственных свойств целевого объекта (важный).
Reflect.ownKeys(target)
Returns an array of the target object's own (not inherited) property keys.
Что это значит? Чтобы объяснить это, давайте посмотрим на этот пример.
function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.getIntro= function() {
return `${this.name} is ${this.age} years old!!`
}
let student = new Person('Anuj', 11);
console.info(Reflect.ownKeys(student).length) // 2
console.info(student.getIntro()) // Anuj is 11 years old!!
Здесь вы можете видеть, что он вернул только свои собственные свойства, в то время как объект все еще наследует свойство от своего родителя.
Для получения дополнительной информации обратитесь к этому: Reflect API
let myobject= {}
let isempty = !!Object.values(myobject);
console.info(isempty);Простой однострочник:
console.info(Object.values({id:"1",age:23,role_number:90}).length);
Литералы объектов в javascript по умолчанию являются ассоциативными массивами, например object.propertyName.propertyValue совпадает с object [propertyName] [propertyValue]