JavaScriptにおけるループの無駄な反復処理の最適化
次のコードでは、あるプログラマーが配列内に数字3が存在するかどうかをチェックしています:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let exists = false;
for (let elem of arr) {
if (elem === 3) {
exists = true;
}
}
console.log(exists);
この解決策の何が問題でしょうか? ループ内に余分な操作は行われていないように見えます。
しかし問題は、数字3が配列内に存在すると判定された後も、
ループが配列の最後まで回り続けてしまうことです。
最も非効率なのは、数字3が配列の先頭近くで見つかった場合で、
配列の長さが例えば1000要素だったとします。
すると、1000回もの無駄な余分なループの反復が発生することになります! 最適とは言えません。
ループを適切なタイミングで停止させて、コードを最適化しましょう:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let exists = false;
for (let elem of arr) {
if (elem === 3) {
exists = true;
break;
}
}
console.log(exits);
次のコードは、合計が10を超えるまでに配列の要素をいくつ足す必要があるかを数えています。
最適化を実行してください:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let sum = 0;
let i = 1;
for (let elem of arr) {
sum += elem;
if (sum <= 10) {
i++;
}
}
console.log(i);
次のコードは、指定された範囲から偶数を出力します。 最適化を実行してください:
for (let i = 0; i <= 100; i++) {
if (i % 2 === 0) {
console.log(i);
}
}
次のコードは、2と3の両方で同時に割り切れる数を出力します。
最適化を実行してください:
for (let i = 0; i <= 100; i++) {
if (i % 2 === 0 && i % 3 === 0) {
console.log(i);
}
}
次のコードは、現在の年のすべての13日の金曜日を探します。 最適化を実行してください:
for (let i = 0; i <= 11; i++) {
let curr = new Date;
let last = new Date(curr.getFullYear(), i + 1, 0).getDate();
for (let j = 1; j <= last; j++) {
let date = new Date(curr.getFullYear(), i, j);
if (date.getDate() === 13 && date.getDay() === 5) {
console.log(date);
}
}
}