Вопрос: Длина объекта JavaScript


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

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

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


1794


источник


Ответы:


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

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(myArray);

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


Вот обновление с 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

1983



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

Object.keys(myArray).length

1387



обновленный : Если вы используете 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;
};

249



Use something as simple as:

Object.keys(obj).length

It doesn't have to be difficult and definitely doesn't require another function to accomplish.


149



Here's the most cross-browser solution.

This is better than the accepted answer because it uses native Object.keys if exists. Thus, it is the fastest for all modern browsers.

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;

42



I'm not a JavaScript expert, but it looks like you would have to loop through the elements and count them since Object doesn't have a length method:

var element_count = 0;
for (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".


26



This method gets all your object's property names in an array, so you can get the length of that array which is equal to your object's keys' length.

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

25



To not mess with the prototype or other code, you could build and extend your own object:

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

If you always use the add method, the length property will be correct. If you're worried that you or others forget about using it, you could add the property counter which the others have posted to the length method, too.

Of course, you could always overwrite the methods. But even if you do, your code would probably fail noticeably, making it easy to debug. ;)


19



Here's how and don't forget to check that the property is not on the prototype chain:

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

14



Here is a completely different solution that will only work in more modern browsers (IE9+, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+)

See jsFiddle

Setup your Associative Array class

/**
 * @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;
    }
});

Now you can use this code as follows...

var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);

13



For some cases it is better to just store the size in a separate variable. Especially, if you're adding to the array by one element in one place and can easily increment the size. It would obviously work much faster if you need to check the size often.


12