javascript - 数组过滤和对象转换: what is fastest and what other considerations matter?

标签 javascript arrays performance

假设我需要将数组转换为对象,并在此过程中进行一些过滤。

我有两种方法,一种是可链接的函数方法,例如 .map.filter.reduce,另一种是循环带有老式for循环的数组并改变一个对象。

功能方式:

const output = fields
    .filter(field => field.required)
    .map(field => field.name)
    .reduce((acc, cur, i) => {
      acc[cur] = false;
      return acc;
    }, {});

老派for循环方式:

let output2 = {};
for (var i = 0; i < fields.length; i++) {
  if (fields[i].required) {
    output2[fields[i].name] = false;
  }
}

我更喜欢函数式方法,因为我认为它可以带来更好的可读代码。然而,我很惊讶(也有点失望)地发现,函数式方法始终比非函数式、老式的 for-loop 转换方式慢。请查找the JSBench here .

我认为这里可能有几个问题:

  1. 我是个白痴,我的实现有缺陷但可以优化。
  2. “JSBench 不是衡量性能的最佳方法。工具 X、Y、Z 是衡量性能的更好方法”
  3. “函数式方法的性能损失是值得的,因为您可以使用 const,它具有其他有益的方面,例如(半)不变性。”

有人愿意称重吗?

您可以在 JSBench 链接中找到我正在使用的测试数组。

最佳答案

“过滤映射减少”循环同一数组 3 次。 所以一个 for 循环总是更快。 但减少它本身的效果就很好

    const output = fields
    .reduce((acc, cur, i) => {
      if(cur.required){
        acc[cur.name] = false;
      }
      return acc;
    }, {});

关于javascript - 数组过滤和对象转换: what is fastest and what other considerations matter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45370419/

相关文章:

java - 如何使用旧的 hibernate 条件进行批处理?

javascript - 保存 dat.gui 预设以动态添加控件?

python - 如何减少python中的运行时间?

javascript - Vue.js:在 HMR 上解决的不一致 "Unknown Custom Element"

c++ - 使用指针创建静态数组?

php - 用其他数组中的值替换数组中的占位符

php - 数组的 strpos

c# - 为什么将 List<T>.AddRange 方法设为通用方法会影响性能?

javascript - 为什么 ColorBox 无法正确加载?

javascript - 模态工作,直到重复