这个问题和How to efficiently count the number of keys/properties of an object in JavaScript?几乎一样。
我想知道一条额外的信息:确定对象中键的数量的"constant-time“方法是什么?我最关心的是在Node.JS中做这件事,因为浏览器上的大多数对象都不是太大而不是很重要。
EDIT:在Google Chrome和Node.JS中,Object.keys(obj).length
似乎以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
发布于 2011-11-01 00:47:17
请参阅源代码,特别是GetLocalElementKeys
发布于 2011-11-01 21:50:17
经过一些研究,没有办法在固定时间内确定JavaScript对象中的键数,至少不能在节点中确定。现在还不是时候。Node在内部跟踪此信息,但它不公开它,因为在ECMA-262第5中没有这样做的方法。
值得注意的是,Harmony (ECMA版本6)可能本机支持Map和Set。我不确定这些产品的规格会是什么。
有人告诉我,我们需要向TC39委员会提出这个问题。
发布于 2014-01-16 13:12:00
ECMA6Harmony引入了Map
和Set
类,您可能会使用它们(在未来:)
var map = new Map;
map.set('a', 'b');
console.log(map.size); // prints 1
我认为它的复杂度应该是O(1),而不是尝试。您可以通过node --harmony script.js
在节点0.11+中运行它。
另一种方法是使用Proxy
类,它也是和谐地添加的。
https://stackoverflow.com/questions/7956554
复制相似问题