Длина объекта JavaScript

У меня есть объект JavaScript. Есть ли встроенный или принятый наилучший способ получить длину этого объекта?

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

Литералы объектов в javascript по умолчанию являются ассоциативными массивами, например object.propertyName.propertyValue совпадает с object [propertyName] [propertyValue]

neitony 13.02.2011 19:19

Добавлен однострочный файл в Underscore.js, который делает это: stackoverflow.com/a/11346637/11236

ripper234 08.07.2012 14:31

После строчного ответа используйте Object.keys (myArray) .length, как сказал @aeosynth.

Ranadheer Reddy 22.06.2013 11:50

@neitony - это отчасти правда, но так много людей привыкли к «ассоциативному массиву» PHP, что они могут предположить, что он означает «ассоциативная карта упорядоченный», когда объекты JS фактически неупорядочены.

cloudfeet 23.07.2013 20:53

ммм в хроме, может быть, больше, я могу использовать Object.getLength(obj), не знаю, откуда он ... вероятно, jquery

Muhammad Umer 10.08.2013 18:36

хорошо, как насчет Object.keys(obj).length

Muhammad Umer 25.02.2015 03:14

«В JavaScript нет ассоциативных массивов - в нем есть только объекты, которые можно использовать как понятие ассоциативных массивов». Есть разница, которая затронула одну из моих систем - ассоциативные массивы ([]) имеют встроенное свойство «длина», что означает, что вы должны следить за ним при добавлении динамических ключей. У объектов ({}) этой проблемы нет.

mosheb 30.12.2015 00:41

Почему недопустимый объект object.length? Он возвращает правильный результат для меня.

Adrian M 26.06.2016 20:01

сравнение производительности: jsben.ch/#/oSt2p

EscapeNetscape 17.10.2016 14:46

Возможный дубликат Как получить длину объекта

Mišo 29.11.2018 16:40

В приведенном выше примере myObject.length не определено, по крайней мере, в среде браузера. Вот почему это недействительно, @AdrianM

Andrew Koster 10.05.2019 22:31

попробуйте этот Object.keys(myObject).length

Piyush Rana 06.10.2020 12:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2 572
12
2 103 118
40
Перейти к ответу Данный вопрос помечен как решенный

Ответы 40

Я не эксперт по JavaScript, но похоже, что вам придется перебирать элементы и подсчитывать их, поскольку у объекта нет метода длины:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey: Справедливости ради, документация JavaScript фактически явно ссылается на использование переменных типа Object таким образом как «ассоциативные массивы».

Не сработает, потому что учитываются и методы, добавленные через прототип.

Lajos Meszaros 08.10.2013 15:32

Вот как это сделать, и не забудьте проверить, что это свойство не входит в цепочку прототипов:

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 14.06.2011 15:30

@vsync Вы очень правы. Всегда нужно проводить необходимые проверки работоспособности :)

Tres 24.06.2011 06:03

Я обернул этот ответ как плагин jQuery для тех, кто не любит возиться с Object: stackoverflow.com/a/11346637/11236

ripper234 05.07.2012 18:39

@James Coglan, почему вы объявляете функцию в классе Object, а не просто как обычную функцию? т.е. функция getSize (obj) {...}?

alexserver 14.03.2013 22:07

@alexserver Я думаю, он просто поддерживает правильную структуру. Эта функция возвращает размер объекта, поэтому имеет смысл сделать его расширением Object. Держите свой код чистым и удобным в обслуживании.

Pijusn 31.05.2013 19:55

Однако этот метод более ошибочен, особенно когда hasownprop редко сбрасывается при удалении ключей объекта с помощью ключевого слова delete.

Clain Dsilva 28.01.2014 18:13

Почему все это игнорируют: Object.keys(obj).length

Muhammad Umer 25.02.2015 03:14

@MuhammadUmer Возможно, потому что этого метода даже не существовало, когда был написан этот ответ. Даже сегодня для его использования, вероятно, потребуется полифилл для старых браузеров.

Chris Hayes 09.05.2015 04:53

Re Object.keys (obj) .length: это потому, что IE8 не поддерживает этот метод.

stonyau 09.01.2016 09:06

@stonyau IE8, IE9, IE10 - мертвые браузеры, которые не получают поддержки от Microsoft. Пользователи IE8, IE9, IE10 получают уведомление от Microsoft о том, что они используют старый неподдерживаемый браузер и должны ожидать, что у них ничего не получится. support.microsoft.com/en-us/kb/3123303

Lukas Liesis 19.01.2016 12:08

Да, это 2017 год. Никто не должен использовать ничего, кроме Object.keys(myObj).length. Этот ответ был правильным в 2008 году, но не сейчас.

Ryan Shillington 26.07.2017 17:46

Не уверен, что это уже упоминалось, потому что TL; DR, но расширение встроенных объектов JavaScript не одобряется.

Matthew Layton 04.04.2018 11:52

Ни функции Object.keys(), ни функции getOwnProperty*() не дадут вам правильный ответ, если их параметр будет new Date(), который, конечно же, является объектом (typeof new Date() === 'object'). Странно…

Przemek 20.05.2018 23:27

@ Przemek Я не понимаю, о чем вы. Object.keys(new Date()).length дает 0, x = new Date(); Object.keys(x).length также дает 0.

Phlarx 23.05.2018 21:48

Это происходит потому, что ни одно из свойств Date не является перечислимым. Например: Object.getOwnPropertyDescriptor(new Date().__proto__, 'getDay')

Cristian Traìna 18.12.2019 17:59

Мне нравится, что "вызывает наименьшее количество ошибок"

MadeInDreams 10.12.2020 10:57

Если вы знаете, что вам не нужно беспокоиться о проверках hasOwnProperty, вы можете сделать это очень просто:

Object.keys(myArray).length

почему нет? насколько я знаю, это стандарт: developer.mozilla.org/en/JavaScript/Reference/Global_Objects‌ /…

vsync 06.06.2011 15:51

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

aeosynth 06.06.2011 23:08

@ ripper234 Это зависит от ваших требований.

KOVIKO 02.02.2012 01:12

Согласно этой таблице IE8 поддерживает 4/34 «стандартов». Вау.

Ben 13.07.2012 06:26

время переключиться на firefox = к сожалению, вы переходите не означает, что пользователи вашего сайта будут ...

mdup 13.08.2012 15:25

@ ripper234 нет поддержки IE = время до полифил

John Dvorak 13.12.2012 10:27

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; } }

EpicVoyage 08.05.2013 18:03

По крайней мере, он работает на стороне сервера node.js :) Спасибо за этот ответ.

GabLeRoux 19.08.2013 02:12

@ ripper234: нет IE8, Object.keys or= (obj) -> key for own key of obj (CoffeeScript, вы можете легко скопировать сгенерированный вывод).

Konrad Borowski 01.09.2013 14:51

@ ripper234, кому небезразличен IE, никого не должны волновать нестандартности IE, только стандарты. пользователи хотят использовать IE, тогда они не будут перемещаться по моему сайту, меня это больше не волнует. разработчики не должны использовать полифиллы, а не стандарты, разработанные, например, "разработчиками"

albanx 21.03.2014 19:17

создание нового массива только для того, чтобы подсчитать его длину? Это переизбыток ресурсов

Steel Brain 19.01.2015 08:50

В спецификации сказано, что метод keys () возвращает только имена собственных свойств объекта, поэтому использование этого метода позволит избежать проверки hasOwnProperty.

John 03.04.2015 00:06

@SteelBrain - не оптимизируйте преждевременно. Если вам нужно сохранить ресурсы, я бы рекомендовал сохранить отдельную переменную длины (или использовать цикл for), но это, вероятно, необходимо только при работе с огромными хешами.

PhilT 14.04.2015 11:32

@albanx Такое отношение не продвинет вас далеко в веб-разработке. Сайты созданы для посетителей, а не для разработчиков.

Francisco Hodge 20.05.2015 21:32

Отличный полифил для устаревшего IE по адресу: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Chaoix 06.08.2015 17:52

map создает массив той же длины. Вы имели в виду filter?

Oriol 29.11.2016 02:03

Даже если вы беспокоитесь о функциях .hasOwnProperty*(), вы не получите правильного ответа, если бы объект, который вы хотели проверить, был new Date().

Przemek 20.05.2018 23:26

Если вас беспокоит скорость, оказывается, что Object.values(myObject).length быстрее. По крайней мере, в Chrome v67. gist.github.com/flekschas/5aad97d1c2520db7af0a9623deec005f

F Lekschas 31.07.2018 18:01

Нет поддержки IE? Получите лучший браузер.

Dev 13.11.2020 00:38

Чтобы не связываться с прототипом или другим кодом, вы можете создать и расширить свой собственный объект:

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', что может быть дорогостоящим, если массив большой.

Emeka Mbah 01.06.2016 22:53

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

А как насчет этого -

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.

tokyovariable 01.08.2013 21:05

Я использую подчеркивание, и этот пост просто напомнил мне, что я использую его недостаточно в этом проекте. Если вы работаете с объектами, у вас должен быть доступен файл underscore.js.

jbolanos 21.11.2013 00:51

Подчеркивание> (все - ['lo-dash'])

Rayjax 11.04.2014 12:13

underscorejs, то, что должно быть в js :)

resgef 30.10.2015 13:02

Вопрос: Почему в цикле используется дополнительный оператор if?

NoobishPro 12.02.2017 00:04

@Babydead, чтобы отличать реальные свойства объекта от унаследованных. developer.mozilla.org/en/docs/Web/JavaScript/Reference/…

ripper234 12.02.2017 22:56

Ниже представлена ​​версия ответа Джеймса Коглана на CoffeeScript для тех, кто отказался от прямого JavaScript :)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size

Вы, вероятно, хотели сказать size++ for own key of obj (own key является синтаксическим сахаром в CoffeeScript). Использование hasOwnProperty непосредственно из объекта опасно, поскольку оно ломается, когда объект действительно имеет такое свойство.

Konrad Borowski 01.09.2013 14:47

OP не запрашивал версию CoffeeScript, и она не помечена как таковая. Это неверный ответ на вопрос.

Francisco Hodge 05.12.2015 00:01

Вот другая версия ответа Джеймса Когана. Вместо передачи аргумента просто создайте прототип класса 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 - плохая идея.

Dziad Borowy 14.10.2013 14:50

@tborychowski, пожалуйста, объясните почему?

Mohamad 05.03.2014 17:09

вот одна статья: bit.ly/1droWrG. Я не говорю, что этого нельзя делать, просто вам нужно знать все последствия, прежде чем это делать.

Dziad Borowy 05.03.2014 19:55

Если вы собираетесь расширить встроенные прототипы или заполнить свойство (например, обезьяна-патч), сделайте это правильно: для прямой совместимости сначала проверьте, существует ли свойство, а затем сделайте свойство неперечисляемым, чтобы собственные ключи построенных объектов не загрязнены. Для методов используйте действительныйметоды. Моя рекомендация: следуйте эти примеры, который демонстрирует, как добавить метод, который ведет себя как можно ближе к встроенным методам.

Sebastian Simon 09.05.2020 12:43

Вот совершенно другое решение, которое будет работать только в более современных браузерах (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"] = "некоторая опора"; полностью нарушает функцию

Panos Theof 26.10.2014 14:16

@PanosTheof Я не думаю, что вы хотели бы, чтобы он сохранял значение, если вы использовали свойство length, любой код, который его использовал, должен был бы гарантировать, что он не пытался сохранить значение для length, но я думаю, что это было бы то же самое, если это тоже был стандартный массив. Переопределение hasOwnProperty для любого объекта, скорее всего, приведет к нежелательному результату.

Ally 27.10.2014 03:03

Вот самое кроссбраузерное решение.

Это лучше, чем принятый ответ, потому что он использует собственный 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/…

John Slegers 07.03.2016 15:40

Если у нас есть хеш

hash = {"a" : "b", "c": "d"};

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

keys(hash).length

Это отличный ответ, однако я не могу найти никакой документации для этой функции клавиш. Так что я не могу быть уверен в кроссбраузерной поддержке.

chim 03.09.2015 12:54

К сожалению, это не такой хороший ответ, как я сначала подумал! Оказывается, функция клавиш доступна только в веб-консолях Chrome и Firefox. Если вы поместите этот код в скрипт, он завершится с ошибкой Uncaught ReferenceError: ключи не определены

chim 03.09.2015 13:14
stackoverflow.com/questions/32372685/…
chim 03.09.2015 13:17

Чем это отличается от ответ aeosynth?

Peter Mortensen 17.09.2016 21:32

Как и у большинства проблем с 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());

не модифицируйте прототип :)

zero_cool 02.10.2018 01:45

Изменение прототипа фабричной функции - это способ их расширения.

Ron Sims II 03.10.2018 18:35

Этот метод получает все имена свойств вашего объекта в массиве, поэтому вы можете получить длину этого массива, равную длине ключей вашего объекта.

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

Метод ключей @PatrickRoberts не возвращает свойства из цепочки прототипов. Итак, зачем нужен hasOwnProperty здесь. Также getOwnProperty вернет скрытые свойства, так как длина находится в массиве и т. д.

Muhammad Umer 26.02.2015 19:07

Свойство

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

Если вы собираетесь расширить встроенные прототипы или заполнить свойство (например, обезьяна-патч), сделайте это правильно: для прямой совместимости сначала проверьте, существует ли свойство, а затем сделайте свойство неперечисляемым, чтобы собственные ключи построенных объектов не загрязнены. Для методов используйте действительныйметоды. Моя рекомендация: следуйте эти примеры, который демонстрирует, как добавить метод, который ведет себя как можно ближе к встроенным методам.

Sebastian Simon 09.05.2020 12:34

Простое решение:

  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. Это неверный ответ на вопрос.

Francisco Hodge 05.12.2015 00:07

Вы всегда можете выполнить Object.getOwnPropertyNames(myObject).length, чтобы получить тот же результат, что и [].length для обычного массива.

Object.keys() возвращает массив, содержащий имена только тех свойств, которые можно перечислить. Если вам нужен массив со ВСЕМИ свойствами, вам следует использовать Object.getOwnPropertyNames(). См. developer.mozilla.org/en/docs/Web/JavaScript/Reference/…

John Slegers 07.03.2016 15:39

Чем это отличается от ответ aeosynth?

Peter Mortensen 17.09.2016 21:35

Если вам не нужна поддержка Internet Explorer 8 или более ранней версии, вы можете легко получить количество свойств в объекте, выполнив следующие два шага:

  1. Запустите либо Object.keys(), чтобы получить массив, содержащий имена только тех свойств, которые являются перечислимый или Object.getOwnPropertyNames(), если вы хотите также включить имена свойств, которые не являются перечислимыми.
  2. Получите свойство .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?

Peter Mortensen 17.09.2016 21:39

Это потому, что он показывает, как сделать его функцией и методом глобального объекта (более объектно-ориентированным и использует некоторую форму инкапсуляции); однако ответ aeosynth этого не делает.

Mystical 18.09.2016 04:34

Если вы собираетесь расширить встроенные прототипы или заполнить свойство (например, обезьяна-патч), сделайте это правильно: для прямой совместимости сначала проверьте, существует ли свойство, а затем сделайте свойство неперечисляемым, чтобы собственные ключи построенных объектов не загрязнены. Для методов используйте действительныйметоды. Моя рекомендация: следуйте эти примеры, который демонстрирует, как добавить метод, который ведет себя как можно ближе к встроенным методам.

Sebastian Simon 09.05.2020 12:45

Кроме того, как написание метода «более эффективно»?

Sebastian Simon 09.05.2020 12:46

Мы можем найти длину объекта, используя:

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.

MacroMan 13.08.2019 12:31

Просто используйте это, чтобы получить length:

Object.keys(myObject).length

объясните, пожалуйста, чем ваш ответ отличается от stackoverflow.com/a/6700/8632727

Patata 13.02.2018 16:04

Хорошо, всегда лучше называть переменные в соответствии с тем, что они есть на самом деле. Делает ваш код более читабельным для других разработчиков.

Barry Michael Doyle 04.04.2018 11:26

До редактирования «myArray» -> «myObject» это было идентично ответу, получившему второе место по количеству голосов.

Yunnosch 25.05.2018 09:44

То же, что и предыдущие ответы.

Alberto Perez 27.08.2019 12:47

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. Object.values ​​(myObject) .length
  2. Object.entries (myObject) .length
  3. Object.keys (myObject) .length

Какой из вышеперечисленных быстрее 3.

siluveru kiran kumar 21.06.2019 10:23

Object.values ​​(myObject) .length

tdjprog 02.07.2019 00:11

как мы можем сказать, что Object.values ​​(myObject) .length быстрее, есть ли пример Спасибо, @tdjprog

siluveru kiran kumar 02.07.2019 10:02

просто попробуйте это в консоли: var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;

tdjprog 03.07.2019 04:25

почему Object.values ​​(myObject) .length быстрее, где, поскольку Object.entries (myObject) .length не дает вывода даже через некоторое время, в чем причина здесь? Спасибо @tdjprog

siluveru kiran kumar 03.07.2019 10:02

По объяснению будет по порядку. Вы можете отредактируйте свой ответ.

Peter Mortensen 10.07.2020 21:51

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)

вопрос решен вокруг количества свойств. ваш ответ просто показывает, какова длина одной (из многих!) сериализованных форм.

oligofren 21.09.2018 11:50

По объяснению будет по порядку. Вы можете отредактируйте свой ответ.

Peter Mortensen 10.07.2020 21:51

Самый простой способ такой:

Object.keys(myobject).length

Где myobject - это объект, длину которого вы хотите.

Похоже, это просто повторение этот существующий ответ.

Pang 15.11.2018 06:22

@Pang согласился, и он не предоставляет никакого дополнительного контекста, как другие ответы.

Mystical 21.01.2019 07:23

<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;
}

Это не отвечает на вопрос.

connectyourcharger 12.10.2019 15:50

Используйте Object.keys(myObject).length, чтобы получить длину объекта / массива

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.info(Object.keys(myObject).length); //3

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.info(Object.keys(myObject).length)

// o/p 3

Что означает "о / п 3"?

Peter Mortensen 10.07.2020 21:43

Пояснение к этому ответу было бы в порядке.

Peter Mortensen 10.07.2020 21:43

Кроме того, чем он отличается от предыдущих ответов, например ответ шахеба?

Peter Mortensen 10.07.2020 21:45

С помощью встроенного объекта 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);

Другие вопросы по теме