JavaScriptにおける循環操作の最適化

軽い操作であっても、ループ内で何度も繰り返されると多くのリソースを消費する可能性があります。

例を見てみましょう。 ある配列が与えられているとします:

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

この配列要素の平均値を求めてみましょう。 そのためには、要素の合計を求め、それを要素数で割る必要があります。 あるプログラマーがこの問題を次のように解決したとします:

javascriptlet avg  = 0;

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

console.log(avg);

この解決策の問題点を考えてみましょう。 技術的にはコードは正しく動作し、正しい答えを返します。 数学的には、合計全体を数で割ることも、各加数を数で割ることも正しいからです。

しかし、別の問題が生じます。 問題は、配列内の要素の数だけ除算を実行する点です。 結果として、不要な操作を大量に行うことになります。 なぜなら、除算は最後に1回だけ、見つかった合計全体を割るようにすれば済むからです。

コードを最適化してみましょう:

javascriptlet sum = 0;

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

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

次のコードを最適化してください:

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

次のコードを最適化してください:

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