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