1

我有一个非常大的对象,我只想遍历它的值。

如果我写一个像下面这样的循环,对于一个有 1m 个键的对象,散列函数和散列查找将被调用 1m 次。出于性能原因,我想避免这种情况。

for (var key in myObj) {sum+=myObj[key]}

我可以以某种方式只遍历值而不关心键吗?

4

4 回答 4

3

我建议这里可能存在误解。

您可能知道 Javascript 对象不是简单的数组,它们的特定内部实现对 Javascript 代码是隐藏的。对象是键值集合,我相信没有任何保证的顺序。

你怎么知道使用 for (var key in myObj) 进行哈希键查找?

我不认为有任何保证,事实上,这样做需要知道从中计算散列的键的知​​识。然而,您在没有指定键的情况下要求所有值。

有一个合理的可能性是 for (var key in myObj) 已经做了最接近你想要的东西(取决于使用的浏览器或 js 引擎)。我怀疑它更有可能直接扫描内部结构并避免计算哈希,因为您需要所有键。

更多的 js 实现专家,标准可能在这方面提供更多。

于 2012-04-30T06:43:47.790 回答
2

对于这种情况,我建议保留 2 个不同的数组:一个用于键,一个用于值。

IE

keys[0]="user"
values[0]={name:"aaa",email:".......
keys[1].....

所以你可以非常快速地迭代两者

于 2012-04-30T06:39:19.957 回答
1

不,在普通的 JavaScript 解释器上,没有属性的名称就无法获取属性的值。

于 2012-04-30T06:37:19.243 回答
0

不,没有办法避免在这里使用一个键循环。顺便说一句,您在问题中描述的内容更像是一个只有数值的数组。你确定这是一个对象?然后我要做的第一个优化是使用数组来计算总和。之后,世界就在你的脚下:有很多方法可以循环数组

额外链接
额外链接 2

如果真的是性能问题,看看@Duffs Device

于 2012-04-30T06:57:52.597 回答