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

在JavaScript中有效计算对象的键/属性数,javascript,performance,object,node.js,key,Javascript,Performance,Object,Node.js,Key,这个问题和我的几乎一样 我想知道一个额外的信息:什么是确定对象中键数的“恒定时间”?我最关心的是在Node.JS中执行此操作,因为浏览器上的大多数对象都不会太大,因此不会引起太大的关注 编辑: 似乎Object.keys(obj).length在Google Chrome和Node.JS中以线性时间O(n)返回(即取决于obj中的键数)。有更好的O(1)方法吗 我在Node.JS中做了一些测试(源代码如下) 查看源代码,特别是GetLocalElementKeys 经过一点研究之后,没有办法在固

这个问题和我的几乎一样

我想知道一个额外的信息:什么是确定对象中键数的“恒定时间”?我最关心的是在Node.JS中执行此操作,因为浏览器上的大多数对象都不会太大,因此不会引起太大的关注

编辑: 似乎
Object.keys(obj).length
在Google Chrome和Node.JS中以线性时间O(n)返回(即取决于
obj
中的键数)。有更好的O(1)方法吗

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


查看源代码,特别是
GetLocalElementKeys


经过一点研究之后,没有办法在固定时间内确定JavaScript对象中的键数,至少在节点中是如此。。。现在还没有。节点在内部跟踪此信息,但不公开它,因为在ECMA-262中没有这样做的方法

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

有人告诉我,我们需要向TC39委员会提出这个问题

V8的Bug报告:

ECMA6Harmony引入了
Map
Set
类,您可能会使用这些类(将来:)

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



另一种方法是使用
Proxy
类,该类也被和谐地添加。

Nope。我今天感觉很懒…:/我想是星期一的情况。我怀疑从调用“Object.keys()”的结果中获取“.length”的时间是常数,但我也怀疑调用“Object.keys()”的属性数是线性的。在Chrome上,100倍于该对象的项目会导致其速度降低200倍。谢谢,@pimvdb——这真是个令人伤心的消息(Node.JS中有固定时间的键计数方法吗?@BMiner抱歉,我的意思是Yes
Object.keys(o)。length
是o(n)。
。数组上的length
是o(1)。我懒得这么做。请说英语。我很乐意接受你的回答。:PDepending根据对象包含的内容,它们做不同的事情,最坏的情况似乎是在所有元素中执行1 for循环。
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]);
}
test10000: 5ms
test100000: 20ms
test1000000: 371ms
test10000000: 4009ms
var map = new Map;
map.set('a', 'b');
console.log(map.size); // prints 1