Javascript - 更新数组中某些项目属性的最佳方式

Javascript - Optimal way to update properties of some items in array

let list = [ 
 { name: "a", position: 10 },
 { name: "b", position: 71 },
 { name: "c", position: 2 },     
 { name: "d", position: 34 },
 { name: "e", position: 1 },
 { name: "f", position: 0 }
]

更新所有项目,位置大于2,将它们的位置增加1。

我使用了这段代码,但我担心这对于拥有数千名成员的列表来说会很慢:

    list.forEach(i => {
        if (i.position > 2) {
            i.position ++;
        }            
    });

我确定有更好的方法可以做到这一点,所以请帮助我。

不会很慢,但是你的代码有点冗长。我会选择一个简单的 .map():

list = list.map(
    item => item.position <= 2 ? item : {...item, position: item.position + 1}
);

不要为微优化而烦恼,如果代码足够快,请改用可读代码。

你在这里并没有真正的优化问题,尤其是当你对每个元素所做的操作是如此微不足道且快速完成时。根据 @ASDFGerte in ,您甚至可以创建无分支版本。

我举了一个例子,我创建了一个包含 100 万个对象的数组,然后通过您提供的 forEach 发送它,每个 运行 只需要 15-30 毫秒:

function test() {
  let arr = [];

  //Populate array with 1 million objects with pos. from 0-99
  for (i = 1000000; i > 0; i--)
    arr[i] = {
      name: i.toString(),
      position: Math.floor(Math.random() * Math.floor(100))
    };

  let start = performance.now(); //Record start time

  arr.forEach(i => { //Exact loop from question
    if (i.position > 2) {
      i.position++;
    }
  });

  let end = performance.now(); //Record end time
  console.log('Time to Execute:', end - start, 'ms');
}
<button onclick="test()">Execute</button>

如果你的数量像你提到的那样在“千”的水平上,那么你可以在这里停下来,用你所拥有的东西安心入睡,因为这可能足够快供你使用。

但是,如果您的数量比这个还要大,比如说数以百万计的 10 或 100,那么您可能需要研究称为 Web Workers 的东西,以便将任务分成块以 运行同时

您可以将您的列表分成小于某个阈值(例如,100 万)的部分,并让工作人员同时处理这些部分,这样您使用的总时间将只与最慢的组一样长.不过,这不再是关于优化循环逻辑了。