JavaScript: 配列処理をもっと便利に!forEachのショートサーキットテクニック
JavaScript 配列の forEach でループ処理をショートサーキットする方法
例外を投げる
最も簡単な方法は、例外を投げる方法です。
try {
[1, 2, 3].forEach(function(el) {
console.log(el);
if (el === 2) throw new BreakException();
});
} catch (e) {
if (e !== BreakException) throw e;
}
function BreakException() {}
このコードでは、el
が 2 の場合に BreakException
例外を投げ、ループ処理を中断しています。ただし、例外処理は本来エラー処理用なので、乱用は避けたほうが良いでしょう。
some
メソッドは、配列要素のうち1つでも条件に合致するかどうかを判定します。この性質を利用して、ループ処理を中断することができます。
[1, 2, 3].some(function(el) {
console.log(el);
return el === 2;
});
このコードでは、el
が 2 の場合に true
を返し、ループ処理を中断しています。some
メソッドは条件に合致する要素が見つかった時点で処理を終了するため、ショートサーキットに適しています。
[1, 2, 3].every(function(el) {
console.log(el);
return el <= 2;
});
forEach
でループ処理をショートサーキットするには、いくつかの方法があります。それぞれの特徴を理解して、状況に応じて使い分けることが重要です。
- 例外を投げる: 手軽だが、例外処理の乱用は避ける
- some メソッド: 条件に合致する要素が見つかった時点で処理を終了
例外を投げる
try {
[1, 2, 3].forEach(function(el) {
console.log(el);
if (el === 2) throw new BreakException();
});
} catch (e) {
if (e !== BreakException) throw e;
}
function BreakException() {}
some メソッドを使う
[1, 2, 3].some(function(el) {
console.log(el);
return el === 2;
});
every メソッドを使う
[1, 2, 3].every(function(el) {
console.log(el);
return el <= 2;
});
その他のショートサーキット方法
return を使う
ループ処理内で return
を使うと、その時点でループ処理を終了することができます。
[1, 2, 3].forEach(function(el) {
console.log(el);
if (el === 2) return;
});
このコードでは、el
が 2 の場合に return
を実行し、ループ処理を中断しています。ただし、return
はループ処理全体を終了してしまうので、注意が必要です。
フラグ変数を使って、ループ処理を中断するかどうかを制御する方法もあります。
var isBreak = false;
[1, 2, 3].forEach(function(el) {
console.log(el);
if (el === 2) {
isBreak = true;
return;
}
});
if (isBreak) {
console.log("ループ処理が中断されました");
}
このコードでは、el
が 2 の場合に isBreak
を true
に設定し、ループ処理を中断しています。isBreak
をチェックすることで、ループ処理が中断されたかどうかを判断することができます。
自作のショートサーキット関数を使う
上記の方法を参考に、自作のショートサーキット関数を作成することもできます。
function shortCircuitForEach(array, callback) {
var isBreak = false;
array.forEach(function(el) {
if (callback(el)) {
isBreak = true;
return;
}
});
return isBreak;
}
var isBreak = shortCircuitForEach([1, 2, 3], function(el) {
console.log(el);
return el === 2;
});
if (isBreak) {
console.log("ループ処理が中断されました");
}
このコードでは、callback
関数でループ処理を中断するかどうかを判断し、isBreak
を返しています。
javascript arrays foreach