这个问题几乎与How to efficiently count the number of keys/properties of an object in JavaScript?相同。
我想知道一条额外的信息:什么是确定对象中键数的“恒定时间”方式?我最关心的是在Node.JS中这样做,因为浏览器上的大多数对象都不是太大而不是非常值得关注。
修改
似乎Object.keys(obj).length
在Google Chrome和Node.JS中以线性时间O(n)返回(即取决于obj
中的键数)。有更好的O(1)方法吗?
我在Node.JS做了一些测试(源代码如下)
var tests = [10e3, 10e4, 10e5, 10e6]
for(j in tests) {
var obj = {};
for(i = 0; i < tests[j]; i++)
obj[i] = i;
console.time('test' + tests[j]);
Object.keys(obj).length;
console.timeEnd('test' + tests[j]);
}
对于n = 10e3,10e4,10e5,10e6 ......结果是:
test10000: 5ms
test100000: 20ms
test1000000: 371ms
test10000000: 4009ms
答案 0 :(得分:5)
经过一些研究后,无法在常量时间内确定JavaScript对象中的键数,至少在Node ...中还没有确定。 Node在内部跟踪这些信息,但它没有公开它,因为在ECMA-262 5th中没有方法可以这样做。
值得注意的是,Harmony(ECMA版本6)可能原生支持地图和集合。不确定这些规格会是什么样的。
我被告知我们需要在TC39委员会中提出这一点。
答案 1 :(得分:1)
ECMA 6和谐介绍了您可以使用的Map
和Set
类(将来:)
var map = new Map;
map.set('a', 'b');
console.log(map.size); // prints 1
我认为它应该具有复杂性O(1),尽管没有尝试过。您可以通过node --harmony script.js
在节点0.11+中运行它。
另一种方法是使用{em>和谐中添加的Proxy
类。
答案 2 :(得分:0)
查看来源,特别是GetLocalElementKeys