有效地计算JavaScript中对象的键/属性的数量

这个问题几乎是相同的如何有效地计算一个对象在JavaScript中的键/属性的数量? 。

我想知道一个额外的信息:什么是“ 恒定时间 ”的方式来确定一个对象中的键的数量? 我最关心的是在Node.JS中这样做,因为浏览器上的大多数对象都不是太大而不值得担心。

编辑:看来Object.keys(obj).length返回线性时间O(N)在谷歌浏览器和Node.JS(即取决于密钥在obj的数量)。 有更好的O(1)方法吗?

我在Node.JS中做了一些testing(源代码如下)

 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 

查看源代码,特别是GetLocalElementKeys

v8 objects.cc

经过一番研究之后,没有办法确定JavaScript Object中的键的数量,至less不是在Node中,还没有完全确定。 节点内部保持跟踪这个信息,但它不暴露它,因为在ECMA-262 5th中没有这样做的方法。

值得注意的是,Harmony(ECMA版本6)可以本地支持地图和集合。 不知道这些规范将会变成什么样子。

我被告知,我们需要把TC39委员会提出来。

V8的Bug报告: http : //code.google.com/p/v8/issues/detail? id = 1800

ECMA 6和谐引入了你可能使用的MapSet类(在未来:)

 var map = new Map; map.set('a', 'b'); console.log(map.size); // prints 1 

我相信它应该有复杂性O(1),虽然没有尝试过。 您可以通过node --harmony script.js –harmony node --harmony script.js在节点0.11+中运行它。


另一种方法是使用Proxy类,它也被一致地添加。