【问题标题】:Iterating through Object values without accessing object keys在不访问对象键的情况下迭代对象值
【发布时间】:2012-04-30 06:30:37
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您真的性能问题还是您只是期待一个?你做过测量吗?另外:如果你想要数组行为,为什么不使用数组?
  • 过早的优化是万恶之源。使用实时数据进行测量并比较现实和期望。你也没有回答我关于数组选项的问题。
  • “按索引访问非数字对象属性”的可能重复项:stackoverflow.com/questions/7866275/…

标签: javascript


【解决方案1】:

我认为这里可能存在误解。

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

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

我不认为有任何保证,事实上,这样做需要知道用于计算哈希的键。然而,您在没有指定键的情况下要求所有值。

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

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      Extra link
      extra link 2

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

      【讨论】:

        猜你喜欢
        • 2018-11-28
        • 2019-01-19
        • 1970-01-01
        • 2023-03-31
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-02
        相关资源
        最近更新 更多