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

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

2089 голосов
/ 07 августа 2008

Если у меня есть объект JavaScript, скажем

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

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

Ответы [ 36 ]

2301 голосов
/ 09 августа 2008

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

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
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. Таким образом, ответ будет неполным без упоминания о них.

Тип символа был добавлен в язык для создания уникальных идентификаторов свойств объекта. Основным преимуществом типа Symbol является предотвращение перезаписи.

Object.keys или Object.getOwnPropertyNames не работает для символических свойств. Чтобы вернуть их вам нужно использовать Object.getOwnPropertySymbols.

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2
1551 голосов
/ 03 апреля 2011

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

Object.keys(myArray).length
268 голосов
/ 05 июля 2012

Обновлено : если вы используете 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;
};
50 голосов
/ 01 сентября 2013

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

Это лучше, чем принятый ответ, потому что он использует нативные 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;
33 голосов
/ 07 августа 2008

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

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

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

29 голосов
/ 01 июля 2014

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

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2
24 голосов
/ 11 июня 2011

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

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

Если вы всегда используете метод add, свойство length будет правильным. Если вы беспокоитесь о том, что вы или другие забывают об его использовании, вы можете добавить счетчик свойств, который другие опубликовали, также в методе длины.

Конечно, вы всегда можете переписать методы. Но даже если вы это сделаете, ваш код, вероятно, заметно потерпит неудачу, упрощая отладку. ;)

22 голосов
/ 21 июня 2018

Самый простой -

Object.keys(myObject).length
18 голосов
/ 08 августа 2008

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

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;
16 голосов
/ 18 января 2018

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

Object.keys(myObject).length
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...