JavaScript 对象的长度

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

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

答案

最可靠的答案(即,在引起最少的错误的同时,捕捉您要尝试做的事情的意图)将是:

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

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


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

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

由于现在已内置Object.keys()因此无需修改任何现有原型。

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

符号类型已添加到语言中,以创建对象属性的唯一标识符。 Symbol 类型的主要好处是可以防止覆盖。

Object.keysObject.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

如果您知道不必担心hasOwnProperty检查,则可以非常简单地执行此操作:

Object.keys(myArray).length

更新 :如果您使用的是Underscore.js (建议使用,它是轻量级的!),那么您可以

_.size({one : 1, two : 2, three : 3});
=> 3

如果不是 ,并且您不想由于任何原因弄乱 Object 属性,并且已经在使用 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;
};

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

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

我不是 JavaScript 专家,但由于 Object 没有 length 方法,因此您似乎必须遍历元素并对其进行计数:

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

@palmsey:为了公平起见,JavaScript 文档实际上以这种方式显式地将使用 Object 类型的变量称为 “关联数组”。

最简单的是

Object.keys(myObject).length

此方法将对象的所有属性名称存储在数组中,因此可以获取该数组的长度,该长度等于对象的键的长度。

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

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

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

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

这是并且不要忘记检查该属性是否不在原型链上的方法:

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

只需使用它来获取length

Object.keys(myObject).length