计算对象的键/财产数的最快方法是什么?是否可以在不迭代对象的情况下执行此操作?即,不做:
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.defineProperty(obj、prop、描述符)
您可以将其添加到所有对象:
Object.defineProperty(Object.prototype, "length", {
enumerable: false,
get: function() {
return Object.keys(this).length;
}
});
或单个对象:
var myObj = {};
Object.defineProperty(myObj, "length", {
enumerable: false,
get: function() {
return Object.keys(this).length;
}
});
例子:
var myObj = {};
myObj.name = "John Doe";
myObj.email = "leaked@example.com";
myObj.length; // Output: 2
通过这种方式添加,它不会在中显示。。在循环中:
for(var i in myObj) {
console.log(i + ": " + myObj[i]);
}
输出:
name: John Doe
email: leaked@example.com
注意:它在Internet Explorer 9之前的浏览器中不起作用。
其他回答
OP没有指定对象是否为nodeList。如果是,那么可以直接对其使用长度方法。例子:
buttons = document.querySelectorAll('[id=button)) {
console.log('Found ' + buttons.length + ' on the screen');
如前一个答案中所回答的:Object.keys(obj).length
但是:因为我们现在在ES6中有一个真正的Map类,所以我建议使用它,而不是使用对象的财产。
const map = new Map();
map.set("key", "value");
map.size; // THE fastest way
如果您真的遇到了性能问题,我建议使用一个函数包装在对象中添加/删除财产的调用,该函数还可以增加/减少适当命名的(size?)属性。
您只需计算一次财产的初始数量,然后再继续。如果没有实际的性能问题,就不用麻烦了。只需将这段代码包装在getNumberOfProperties(对象)函数中,然后使用它即可。
我解决这个问题的方法是构建我自己的基本列表实现,该列表记录对象中存储了多少项。这很简单。类似于:
function BasicList()
{
var items = {};
this.count = 0;
this.add = function(index, item)
{
items[index] = item;
this.count++;
}
this.remove = function (index)
{
delete items[index];
this.count--;
}
this.get = function(index)
{
if (undefined === index)
return items;
else
return items[index];
}
}
如果前面答案中的jQuery不起作用,请尝试
$(Object.Item).length