计算对象的键/财产数的最快方法是什么?是否可以在不迭代对象的情况下执行此操作?即,不做:
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左右,这个属性被删除了。)
当前回答
如果你使用Undercore.js,你可以使用_.size(谢谢douwe):
_.size(obj)
或者,您也可以使用_.keys,这对某些人来说可能更清晰:
_.keys(obj).length
我强烈推荐Undercore.js。它是一个非常紧凑的库,可以做很多基本的事情。只要可能,它们都匹配ECMAScript 5,并遵循本机实现。
否则,我支持Avi Flax的回答。我编辑了它以添加到MDC文档的链接,其中包括可以添加到非ECMAScript 5浏览器的key()方法。
其他回答
如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具有相同的浏览器支持。
然而,在大多数情况下,您可能不希望在这些类型的操作中包含非数值,但了解它们的区别总是很好的;)
如前一个答案中所回答的:Object.keys(obj).length
但是:因为我们现在在ES6中有一个真正的Map类,所以我建议使用它,而不是使用对象的财产。
const map = new Map();
map.set("key", "value");
map.size; // THE fastest way
这对数组和对象都有效
//count objects/arrays
function count(obj){
return Object.keys(obj).length
}
使用循环计数对象/数组
function count(obj){
var x=0;
for(k in obj){
x++;
}
return x;
}
计数对象/数组以及字符串的长度
function count(obj){
if (typeof (obj) === 'string' || obj instanceof String)
{
return obj.toString().length;
}
return Object.keys(obj).length
}
您可以使用以下代码:
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;
};
}
然后,您也可以在较旧的浏览器中使用此功能:
var len = Object.keys(obj).length;
如果您真的遇到了性能问题,我建议使用一个函数包装在对象中添加/删除财产的调用,该函数还可以增加/减少适当命名的(size?)属性。
您只需计算一次财产的初始数量,然后再继续。如果没有实际的性能问题,就不用麻烦了。只需将这段代码包装在getNumberOfProperties(对象)函数中,然后使用它即可。