Optimering av cykliska operationer i JavaScript
Även en enkel operation, upprepad många gånger i en loop, kan ta upp många resurser.
Låt oss titta på ett exempel. Antag att vi har en given array:
let arr = [1, 2, 3, 4, 5, 6];
Låt oss hitta medelvärdet av elementen i denna array. För att göra detta måste du hitta summan av elementen och dividera den med antalet. Antag att någon programmerare redan har löst detta problem på följande sätt:
let avg = 0;
for (let elem of arr) {
avg += elem / arr.length;
}
console.log(avg);
Låt oss överväga problemen med denna lösning. Tekniskt sett fungerar koden korrekt och ger rätt svar. Saken är den att matematiskt korrekt är att antingen dividera hela summan med antalet, eller dividera varje term med antalet.
Ett annat problem uppstår dock. Saken är att vi kommer att utföra division lika många gånger som det finns element i vår array. Och det visar sig att vi gör ett stort antal onödiga operationer, eftersom divisionen kunde ha gjorts i slutet - en gång, genom att dividera hela den hittade summan.
Låt oss optimera vår kod:
let sum = 0;
for (let elem of arr) {
sum += elem;
}
let avg = sum / arr.length;
console.log(avg);
Optimera följande kod:
for (let i = 1900; i <= 2100; i++) {
let curr = new Date;
let date = new Date(i, curr.getMonth(), curr.getDate());
if (curr.getDay() === date.getDay()) {
console.log(date);
}
}
Optimera följande kod:
let obj = {a: 10, b: 20, c: 30, d: 40, e: 50};
let sum = 0;
for (let key in obj) {
if (String(obj[key])[0] === '1' || String(obj[key])[0] === '2') {
sum += obj[key];
}
}
console.log(sum);