我有一个JavaScript对象。是否有一种内置或公认的最佳实践方法来获取此对象的长度?

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

当前回答

您可以简单地对任何对象使用Object.keys(obj).length来获取其长度。keys返回一个包含所有对象键(财产)的数组,使用相应数组的长度可以方便地找到该对象的长度。你甚至可以为此编写一个函数。让我们发挥创意,并为其编写一个方法(以及更方便的getter属性):

函数objLength(obj){return Object.keys(obj).length;}console.log(objLength({a:1,b:“summit”,c:“无意义”}));//工作非常好var obj=新对象();obj['fish']=30;obj['ullified content']=null;console.log(objLength(obj));//它也按照您的方式工作,即使用Object构造函数创建它Object.prototype.getLength=函数(){return Object.keys(this).length;}console.log(obj.getLength());//你也可以把它写成一个方法,这样做效率更高Object.defineProperty(Object.prototype,“length”,{get:function(){return Object.keys(this).length;}});console.log(对象长度);//可能最有效的方法是这样做的,并在上面进行了演示,它为对象设置了一个名为“length”的getter属性,该属性返回getLength(this)或this.getLength()的等效值

其他回答

该解决方案适用于多种情况和跨浏览器:

Code

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

在某些情况下,最好将大小存储在单独的变量中。特别是,如果要在一个位置添加一个元素到数组中,并且可以很容易地增加大小。如果你需要经常检查尺寸的话,这显然会更快。

简单的解决方案:

  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.

与大多数JavaScript问题一样,有许多解决方案。您可以扩展Object,无论好坏,它都可以像许多其他语言的字典(+一流公民)一样工作。这没什么错,但另一个选择是构造一个满足您特定需求的新对象。

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

我不是JavaScript专家,但看起来您必须遍历元素并计数,因为Object没有长度方法:

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

@palmsey:公平地说,JavaScript文档实际上明确提到以这种方式使用Object类型的变量作为“关联数组”。