ある配列に対してforeach
を呼び出していて、そのforeach
ブロックの中でもforeach
を呼び出している時に、特定の条件になったら現在のブロックを抜け出したい場合を考えていました。
例えば、次のような感じのコード。
const list: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].forEach((i) => {
list.forEach((n) => {
});
if (i === 5) {
return;
}
});
お分かりの通り、上記のコードのif (i === 5) { return; }
の呼び出しでは、一番外側のブロックを抜け出すことはできません。
もしこれを読んでいるあなただったら、どのように書きますか?
ChatGPTに聞いてみました。
すると次のようなコードを生成してくれました。
const list: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
outerLoop: for (const i of list) {
list.forEach((n) => {
// 内側のループ処理
});
if (i === 5) {
break outerLoop;
}
}
ChatGPTの説明は、次のとおりです。
forEachループでは、returnを使ってもループ自体を途中で抜けることはできません。代わりにfor...ofループを使い、外側のループを途中で終了するためにbreakを使用できます。
以下のように書き換えることで、iが5になった時点で外側のループを抜けることができます。
この例では、outerLoopというラベルを外側のループに付け、break outerLoop;を使ってラベルが指すループを途中で終了させます。これにより、iの値が5になった時点で一番外側のループが終了します。
僕の圧倒的知識不足なのですが、TypeScriptでgoto
のようなラベルを使うことができることを今のいままで知りませんでした。
実はこの程度のコードにおいて、外側のループにラベルを付ける必要はないのです。
上記のコードのミソは、外側のループにおいて、foreach
を使う代わりにfor...of
を使ってる点が大事なところなのでした。
ChatGPTを使うことで、もちろん間違っているコードを生成してしまう場合もあるのですが、正しいプロンプトを開発者側が入力してあげることで、普段使わないような書き方や、そんな書き方があったんだというような発見を与えてくれます。
みなさんもどんどん、ChatGPTを使って新しい発見をしてみてください。