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 ++;
}
});
我相信有更好的方法,所以请帮帮我。
这里没有真正的优化问题,特别是当您对每个元素执行的操作是如此琐碎和快速时。根据@ASDFGerte在上面的评论,你甚至可以创建一个无分支的版本。
我拼凑了一个例子,其中我创建了一个包含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亿或1亿,那么你可能需要考虑一个叫做Web Workers的东西,以便将任务分割成块来并发运行。
你可以把你的列表分成比某个阈值更小的部分(例如:让工人们同时处理这些零件,这样你所用的总时间就和最慢的一组一样长。这将不再是关于优化你的循环逻辑了。
它不会很慢,但是您的代码有点冗长。我会选择一个简单的.map()
:
list = list.map(
item => item.position <= 2 ? item : {...item, position: item.position + 1}
);
不要为微优化而烦恼,如果它足够快,就用可读的代码代替。