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

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

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

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

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

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

Ответы [ 36 ]

7 голосов
/ 18 ноября 2011

Вариант некоторых из вышеперечисленных:

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};

Это немного более элегантный способ интеграции hasOwnProp.

7 голосов
/ 07 марта 2016

Если вам не нужна поддержка 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.log(size(myObj));        // Output : 1
console.log(size(myObj, true));  // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr));        // Output : 6
console.log(size(myArr, true));  // Output : 6
console.log(size(myArr, false)); // Output : 7

См. Также эту скрипку для демонстрации.

6 голосов
/ 27 июня 2013

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

5 голосов
/ 17 сентября 2016

Вы можете просто использовать Object.keys(obj).length на любом объекте, чтобы получить его длину. Object.keys возвращает массив, содержащий все объекты keys (свойства), которые могут пригодиться для определения длины этого объекта по длине соответствующего массива Вы даже можете написать функцию для этого. Давайте возьмем creative и напишем для него метод (вместе с более удобным свойством getter):

function objLength(obj)
{
  return Object.keys(obj).length;
}

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(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.log(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.log(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()
5 голосов
/ 30 мая 2018

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

Object.keys(myobject).length

где myobject - это объект того, что вы хотите, длина

4 голосов
/ 12 января 2016

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

3 голосов
/ 04 июля 2017

Немного опоздал к игре, но хороший способ добиться этого (только для IE9 +) - определить магический метод получения свойства length:

Object.defineProperty(Object.prototype, "length", {
    get: function () {
        return Object.keys(this).length;
    }
});

И вы можете просто использовать его так:

var myObj = { 'key': 'value' };
myObj.length;

даст 1.

3 голосов
/ 22 мая 2017

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

Object.values(myObject).length
3 голосов
/ 04 марта 2013

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

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size
3 голосов
/ 06 января 2015

Недвижимость

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...