计算对象的键/财产数的最快方法是什么?是否可以在不迭代对象的情况下执行此操作?即,不做:
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左右,这个属性被删除了。)
当前回答
我解决这个问题的方法是构建我自己的基本列表实现,该列表记录对象中存储了多少项。这很简单。类似于:
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];
}
}
其他回答
如前一个答案中所回答的:Object.keys(obj).length
但是:因为我们现在在ES6中有一个真正的Map类,所以我建议使用它,而不是使用对象的财产。
const map = new Map();
map.set("key", "value");
map.size; // THE fastest way
我尝试让它对所有对象都可用,如下所示:
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
我解决这个问题的方法是构建我自己的基本列表实现,该列表记录对象中存储了多少项。这很简单。类似于:
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];
}
}
我不知道有什么办法可以做到这一点。然而,为了尽量减少迭代次数,您可以尝试检查__count__的存在,如果它不存在(即,不是Firefox),那么您可以迭代对象并定义它以供以后使用,例如:
if (myobj.__count__ === undefined) {
myobj.__count__ = ...
}
这样,任何支持__count__的浏览器都会使用它,并且只会对那些不支持的浏览器执行迭代。如果计数发生变化而无法执行此操作,则可以始终将其设置为函数:
if (myobj.__count__ === undefined) {
myobj.__count__ = function() { return ... }
myobj.__count__.toString = function() { return this(); }
}
这样,任何时候你引用myobj__count__函数将启动并重新计算。
如果前面答案中的jQuery不起作用,请尝试
$(Object.Item).length