Javascript 数组过滤和对象转换:什么是最快的,还有什么其他考虑事项?

Javascript 数组过滤和对象转换:什么是最快的,还有什么其他考虑事项?,javascript,arrays,performance,Javascript,Arrays,Performance,假设我需要将一个数组转换成一个对象,并在此过程中进行一些过滤 我有两种方法,一种是使用可链接的函数方法,如.map、.filter和.reduce,另一种是使用老式的for loop在数组上循环并变异对象 功能方式: const output = fields .filter(field => field.required) .map(field => field.name) .reduce((acc, cur, i) => { acc[cu

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

我有两种方法,一种是使用可链接的函数方法,如
.map
.filter
.reduce
,另一种是使用老式的
for loop
在数组上循环并变异对象

功能方式:

const output = fields
    .filter(field => field.required)
    .map(field => field.name)
    .reduce((acc, cur, i) => {
      acc[cur] = false;
      return acc;
    }, {});
let output2 = {};
for (var i = 0; i < fields.length; i++) {
  if (fields[i].required) {
    output2[fields[i].name] = false;
  }
}
老派
for loop
方式:

const output = fields
    .filter(field => field.required)
    .map(field => field.name)
    .reduce((acc, cur, i) => {
      acc[cur] = false;
      return acc;
    }, {});
let output2 = {};
for (var i = 0; i < fields.length; i++) {
  if (fields[i].required) {
    output2[fields[i].name] = false;
  }
}
let output2={};
对于(变量i=0;i
我更喜欢函数式方法,因为我认为它能带来更好的可读性代码。然而,我很惊讶(也有点失望)地了解到,功能性方法始终比非功能性的、老式的
for loop
转换方法慢。请找到

我想这里可能有几件事:

  • 我是个白痴,我的实现有缺陷,可以优化
  • “JSBench不是衡量性能的最佳方法。工具X、Y、Z是衡量性能的更好方法”
  • “函数方法带来的性能损失是值得的,因为您可以使用
    const
    ,它还有其他有益的方面,如(半)不变性。”
  • 有人想进来称重吗


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

    另一种功能方式,可能快三倍:

    const output = fields
    .reduce((acc, cur) => {
      if(curr.required) acc[cur.name] = false;
      return acc;
    }, {});
    
    您还可以使用映射(以后性能会更好):

    “filter map reduce”循环是同一数组的3倍。 所以一个for循环总是更快。 但减少其本身的工作很好

        const output = fields
        .reduce((acc, cur, i) => {
          if(cur.required){
            acc[cur.name] = false;
          }
          return acc;
        }, {});
    
    <>你可以考虑使用与./P>结合使用。
    不,一些重复调用的函数将永远不会击败for循环。注意,第一个迭代3次,第二个迭代一次。我认为lodash chains可以写第一个,但实际上可以写第二个(不完全是舒尔)@Jonasw嗯,实际上。。。功能性方法似乎可以更快。不过我注意到有点奇怪:使用3种方法的JSBench比只使用优化的函数和for循环方法的JSBench提供了更好的优化函数实现结果。三个实现:两个实现:@pablo可能有一些很好的内联……正如我所怀疑的,我确实是个白痴。当然,这是一个更好的方法。根据JSBench的说法,这种实现非常接近于
    for loop
    方法:100%对99%,并且在大多数运行中都取得了胜利。我喜欢这种方法,非常干净。但是在一对一的
    for loop
    中,
    for loop
    获胜:这只是一个给你更多可能性的想法。谢谢你,非常感谢@nina:)