Optimierung zyklischer Operationen in JavaScript

Sogar eine leichte Operation, die mehrfach in einer Schleife wiederholt wird, kann viele Ressourcen verbrauchen.

Schauen wir uns ein Beispiel an. Nehmen wir an, wir haben ein Array:

javascriptlet arr = [1, 2, 3, 4, 5, 6];

Lassen Sie uns den Durchschnitt der Elemente dieses Arrays finden. Dazu müssen wir die Summe der Elemente finden und durch die Anzahl teilen. Nehmen wir an, ein Programmierer hat diese Aufgabe bereits wie folgt gelöst:

javascriptlet avg  = 0;

for (let elem of arr) {
  avg += elem / arr.length;
}

console.log(avg);

Lassen Sie uns die Probleme dieser Lösung betrachten. Technisch gesehen funktioniert der Code korrekt und liefert das richtige Ergebnis. Tatsächlich ist es mathematisch korrekt, sowohl die gesamte Summe durch die Anzahl zu teilen, als auch jedes einzelne Summand durch die Anzahl zu teilen.

Es entsteht jedoch ein anderes Problem. Die Sache ist die, dass wir die Division so oft ausführen werden, wie es Elemente in unserem Array gibt. Und es stellt sich heraus, dass wir eine große Anzahl überflüssiger Operationen durchführen, denn die Division hätte man am Ende durchführen können - nur einmal, indem man die gesamte gefundene Summe teilt.

Lassen Sie uns unseren Code optimieren:

javascriptlet sum = 0;

for (let elem of arr) {
  sum += elem;
}

let avg = sum / arr.length;
console.log(avg);
Задание 1

Optimieren Sie den folgenden Code:

javascriptfor (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);
  }
}
Задание 2

Optimieren Sie den folgenden Code:

javascriptlet 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);