2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

特定の条件下でfoeachのブロックから抜ける方法、あなたは思いつきますか?

Last updated at Posted at 2023-03-30

ある配列に対して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を使って新しい発見をしてみてください。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?