首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >高效统计JavaScript中对象的键数/属性数

高效统计JavaScript中对象的键数/属性数
EN

Stack Overflow用户
提问于 2011-11-01 00:25:48
回答 3查看 6.3K关注 0票数 22

这个问题和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做了一些测试(源代码如下)

代码语言:javascript
复制
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...结果是:

代码语言:javascript
复制
test10000: 5ms
test100000: 20ms
test1000000: 371ms
test10000000: 4009ms
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-01 00:47:17

请参阅源代码,特别是GetLocalElementKeys

v8 objects.cc

票数 -2
EN

Stack Overflow用户

发布于 2011-11-01 21:50:17

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

值得注意的是,Harmony (ECMA版本6)可能本机支持Map和Set。我不确定这些产品的规格会是什么。

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

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

票数 7
EN

Stack Overflow用户

发布于 2014-01-16 13:12:00

ECMA6Harmony引入了MapSet类,您可能会使用它们(在未来:)

代码语言:javascript
复制
var map = new Map;
map.set('a', 'b');
console.log(map.size); // prints 1

我认为它的复杂度应该是O(1),而不是尝试。您可以通过node --harmony script.js在节点0.11+中运行它。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7956554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档