计算对象的键/财产数的最快方法是什么?是否可以在不迭代对象的情况下执行此操作?即,不做:
var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) ++count;
(Firefox确实提供了一个神奇的__count__属性,但在版本4左右,这个属性被删除了。)
计算对象的键/财产数的最快方法是什么?是否可以在不迭代对象的情况下执行此操作?即,不做:
var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) ++count;
(Firefox确实提供了一个神奇的__count__属性,但在版本4左右,这个属性被删除了。)
当前回答
我尝试让它对所有对象都可用,如下所示:
Object.defineProperty(Object.prototype,
"length",
{
get() {
if (!Object.keys) {
Object.keys = function (obj) {
var keys = [],k;
for (k in obj) {
if (Object.prototype.hasOwnProperty.call(obj, k)) {
keys.push(k);
}
}
return keys;
};
}
return Object.keys(this).length;
},});
console.log({"Name":"Joe", "Age":26}.length) // Returns 2
其他回答
要在任何ES5兼容环境中执行此操作,如Node.js、Chrome、Internet Explorer 9+、Firefox 4+或Safari 5+:
Object.keys(obj).length
浏览器兼容性Object.keys文档(包括可以添加到非ES5浏览器的方法)
对于项目中有ExtJS 4的用户,您可以执行以下操作:
Ext.Object.getSize(myobj);
这样做的优点是它可以在所有兼容ExtJS的浏览器上工作(包括InternetExplorer6和InternetExplorer8)。然而,我认为运行时间并不比O(n)好,正如其他建议的解决方案一样。
我尝试让它对所有对象都可用,如下所示:
Object.defineProperty(Object.prototype,
"length",
{
get() {
if (!Object.keys) {
Object.keys = function (obj) {
var keys = [],k;
for (k in obj) {
if (Object.prototype.hasOwnProperty.call(obj, k)) {
keys.push(k);
}
}
return keys;
};
}
return Object.keys(this).length;
},});
console.log({"Name":"Joe", "Age":26}.length) // Returns 2
如Avi Flax所述,
Object.keys(obj).length
将对对象上的所有可枚举财产执行此操作,但要同时包含非可枚举财产,您可以改用object.getOwnPropertyNames。区别如下:
var myObject = new Object();
Object.defineProperty(myObject, "nonEnumerableProp", {
enumerable: false
});
Object.defineProperty(myObject, "enumerableProp", {
enumerable: true
});
console.log(Object.getOwnPropertyNames(myObject).length); //outputs 2
console.log(Object.keys(myObject).length); //outputs 1
console.log(myObject.hasOwnProperty("nonEnumerableProp")); //outputs true
console.log(myObject.hasOwnProperty("enumerableProp")); //outputs true
console.log("nonEnumerableProp" in myObject); //outputs true
console.log("enumerableProp" in myObject); //outputs true
如这里所述,这与Object.keys具有相同的浏览器支持。
然而,在大多数情况下,您可能不希望在这些类型的操作中包含非数值,但了解它们的区别总是很好的;)
如果前面答案中的jQuery不起作用,请尝试
$(Object.Item).length