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

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

当前回答

这是最跨浏览器的解决方案。

这比接受的答案更好,因为它使用本机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;

其他回答

更新的答案

以下是截至2016年的最新情况,以及ES5及更高版本的广泛部署。对于IE9+和所有其他支持ES5+的现代浏览器,您可以使用Object.keys(),因此上面的代码变成:

var size = Object.keys(myObj).length;

这不需要修改任何现有的原型,因为Object.keys()现在是内置的。

编辑:对象可以具有无法通过Object.key方法返回的符号财产。因此,如果不提及它们,答案将是不完整的。

将符号类型添加到语言中,以创建对象财产的唯一标识符。符号类型的主要优点是防止覆盖。

Object.keys或Object.getOwnPropertyNames不适用于符号财产。要返回它们,需要使用Object.getOwnPropertySymbols。

var人={[符号('name')]:'John Doe',[符号('age')]:33,“职业”:“程序员”};const propOwn=对象.getOwnPropertyNames(个人);console.log(propOwn.length);//1.let propSymb=对象.getOwnPropertySymbol(人);console.log(propSymb.length);//2.

较旧的答案

最可靠的答案(即,在导致最少错误的情况下,捕捉到您试图做的事情的意图)是:

Object.size=函数(obj){var大小=0,钥匙for(在obj中键入){if(obj.hasOwnProperty(key))大小++;}收益大小;};//获取对象的大小常量myObj={}var size=对象大小(myObj);

JavaScript中有一种约定,即不向Object.prototype中添加内容,因为它可以打破各种库中的枚举。不过,向Object添加方法通常是安全的。


我们可以使用以下公式来计算Object的长度:

const myObject={};console.log(Object.values(myObject).length);

这里有一个完全不同的解决方案,只适用于更现代的浏览器(Internet Explorer 9+、Chrome、Firefox 4+、Opera 11.60+和Safari 5.1+)

看看这个jsFiddle。

设置关联数组类

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

现在您可以按如下方式使用此代码。。。

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

为了不干扰原型或其他代码,您可以构建和扩展自己的对象:

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方法,长度属性将是正确的。如果你担心自己或其他人忘记使用它,你可以将其他人发布的属性计数器添加到长度方法中。

当然,您可以始终覆盖这些方法。但即使您这样做了,您的代码也可能会明显失败,从而易于调试

如果需要公开其大小的关联数据结构,最好使用映射而不是对象。

const myMap=新映射();myMap.set(“firstname”,“Gareth”);myMap.set(“姓氏”,“辛普森”);myMap.set(“年龄”,21);console.log(myMap.size);//3.