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

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

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

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

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

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

Ответы [ 36 ]

2 голосов
/ 09 мая 2014

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

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

  var myObject = {};      // ... your object goes here.

  var length = 0;

  for (var property in myObject) {
    if (myObject.hasOwnProperty(property)){
      length += 1;
    }
  };

  console.log(length);    // logs 0 in my example.
0 голосов
/ 13 февраля 2019

Object.keys NOT возвращает правильный результат в случае объекта наследование . Для правильного подсчета свойств объекта, включая унаследованные, используйте 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.log("Object.keys(myObject):", Object.keys(myObject).length, "(OK)");
console.log("Object.keys(child)   :", Object.keys(child).length, "(wrong)");
console.log("objLength(child)     :", objLength(child), "(OK)");
0 голосов
/ 07 августа 2016

Решение работает для многих случаев и кросс-браузер:

код

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
0 голосов
/ 28 июня 2018

В лучшем случае, на мой взгляд, if (obj.hasOwnProperty(key)) контроль избыточен. Возвращает всегда true.

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
     size++;
   }
   return size;
};
0 голосов
/ 09 апреля 2018

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