【问题标题】:Fastest loop for 1M entries1M 条目的最快循环
【发布时间】:2022-11-28 20:29:25
【问题描述】:

我有一个变量result,其中包含大约 1M 个条目,如下所示:

result = [
  {
    'name': 'x',
    'other fields': '...',
  },
  {
    'name': 'y',
    'other fields': '...',
  },
  .. and so on ..
]

我想创建另一个仅包含名称列表但采用对象格式的数组:

nameArray = [
  {name: 'x'},
  {name: 'y'},
  .. and so on ..
]

我目前正在使用以下循环,但对于 1M 条目来说它非常慢

let nameArray = []
result.forEach(item => {
  let name = {name : item.name}
  nameArray.push(name)
});

实现这一目标的最快方法是什么?我也试过 lodash 地图,但还是有点慢。但我宁愿不使用 lodash,因为它增加了一个依赖项。

【问题讨论】:

  • 您的原始数组已经包含您想要的输出。为什么不简单地忽略其他属性呢?
  • @GerardoFurtado 因为原件包含太多钥匙。我需要将这个变量保存在内存中,因此需要减小它的大小。
  • 您可能会以某种方式将数组拆分为 n 个数组,并使用不同的承诺将值推送到新数组,因此它们在不同的线程中异步运行。
  • 我猜成本是因为 push() 调用 - 使用地图而不是例如let nameArray = result.map(item => ({ name: item.name }))

标签: javascript


【解决方案1】:

使用 for .. of 应该比 forEach 性能更高

const namesResults = []
for (const { name } of result) {
  namesResults.push(name)
}

Here 一个 SO 问题,背后有一些解释

如果你真的需要最高性能的循环,我会尝试所有不同的方法并对它们进行基准测试。其他好的候选人应该是.reduce.map

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2012-09-10
    • 2021-08-28
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多