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

时间:2011-10-31 16:25:48

标签: javascript performance object node.js key

这个问题几乎与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

3 个答案:

答案 0 :(得分:5)

经过一些研究后,无法在常量时间内确定JavaScript对象中的键数,至少在Node ...中还没有确定。 Node在内部跟踪这些信息,但它没有公开它,因为在ECMA-262 5th中没有方法可以这样做。

值得注意的是,Harmony(ECMA版本6)可能原生支持地图和集合。不确定这些规格会是什么样的。

我被告知我们需要在T​​C39委员会中提出这一点。

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

答案 1 :(得分:1)

ECMA 6和谐介绍了您可以使用的MapSet类(将来:)

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

v8 objects.cc