我有一个非常大的对象,我只想遍历它的值。
如果我写一个像下面这样的循环,对于一个有 1m 个键的对象,散列函数和散列查找将被调用 1m 次。出于性能原因,我想避免这种情况。
for (var key in myObj) {sum+=myObj[key]}
我可以以某种方式只遍历值而不关心键吗?
我有一个非常大的对象,我只想遍历它的值。
如果我写一个像下面这样的循环,对于一个有 1m 个键的对象,散列函数和散列查找将被调用 1m 次。出于性能原因,我想避免这种情况。
for (var key in myObj) {sum+=myObj[key]}
我可以以某种方式只遍历值而不关心键吗?
我建议这里可能存在误解。
您可能知道 Javascript 对象不是简单的数组,它们的特定内部实现对 Javascript 代码是隐藏的。对象是键值集合,我相信没有任何保证的顺序。
你怎么知道使用 for (var key in myObj) 进行哈希键查找?
我不认为有任何保证,事实上,这样做需要知道从中计算散列的键的知识。然而,您在没有指定键的情况下要求所有值。
有一个合理的可能性是 for (var key in myObj) 已经做了最接近你想要的东西(取决于使用的浏览器或 js 引擎)。我怀疑它更有可能直接扫描内部结构并避免计算哈希,因为您需要所有键。
更多的 js 实现专家,标准可能在这方面提供更多。
对于这种情况,我建议保留 2 个不同的数组:一个用于键,一个用于值。
IE
keys[0]="user"
values[0]={name:"aaa",email:".......
keys[1].....
所以你可以非常快速地迭代两者
不,在普通的 JavaScript 解释器上,没有属性的名称就无法获取属性的值。
不,没有办法避免在这里使用一个键循环。顺便说一句,您在问题中描述的内容更像是一个只有数值的数组。你确定这是一个对象?然后我要做的第一个优化是使用数组来计算总和。之后,世界就在你的脚下:有很多方法可以循环数组。
如果真的是性能问题,看看@Duffs Device