234

私はこれを試しました:

for(i = 0; i < 5; i++){
    for(j = i + 1; j < 5; j++){
        break(2);
    }
    alert(1);
}

取得するためだけに:

SyntaxError;ステートメントの前にありません

では、JavaScriptでネストされたループをどのように壊すのでしょうか?

4

15 に答える 15

623

次のように、ラベルに割り込むことができるはずです。

function foo () {
    dance:
    for (var k = 0; k < 4; k++) {
        for (var m = 0; m < 4; m++) {
            if (m == 2) {
                break dance;
            }
        }
    }
}
于 2009-10-14T07:47:12.267 に答える
52

このように、内側のループではなく、外側のループに名前を付けて、そのループを解除する必要があります。

outer_loop: 
for(i=0;i<5;i++) {
    for(j=i+1;j<5;j++) {
        break outer_loop;
    }
    alert(1);
}
于 2009-10-14T07:49:27.003 に答える
30

アーロンズを参照してください。それ以外の場合: j=5;i=5の代わりにbreak

于 2009-10-14T07:49:57.710 に答える
28

2つ以上のループから抜け出すには、少なくとも5つの異なる方法があります。

1)親ループを最後に設定します

for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
        {
            i = 5;
            break;
        }
    }
}

2)ラベルを使用する

fast:
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
            break fast;
    }
}

3)変数を使用する

var exit_loops = false;
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
        {
            exit_loops = true;
            break;
        }
    }
    if (exit_loops)
        break;
}

4)自己実行機能を使用する

(function()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
})();

5)通常の機能を使用する

function nested_loops()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
}
nested_loops();
于 2018-08-05T12:26:20.627 に答える
24
loop1:
    for (var i in set1) {
loop2:
        for (var j in set2) {
loop3:
            for (var k in set3) {
                break loop2;  // breaks out of loop3 and loop2
            }
        }
    }

Javascriptのネストされたループから抜け出すための最良の方法からコピーされたコード?

質問を投稿する前に検索してください。リンクは、このページの左側にある最初の関連質問でした。

于 2009-10-14T07:54:19.303 に答える
11

残念ながら、フラグを設定するか、ラベルを使用する必要があります(古い学校のgotoステートメントを考えてください)

var breakout = false;

for(i=0;i<5;i++)
{
    for(j=i+1;j<5;j++)
    {
        breakout = true;
        break;
    }
    if (breakout) break;
    alert(1)
};

ラベルアプローチは次のようになります。

end_loops:
for(i=0;i<5;i++)
{
    for(j=i+1;j<5;j++)
    {
        break end_loops;
    }
    alert(1)
};

編集:ラベルが正しく配置されていません。

も参照してください:

于 2009-10-14T07:47:16.417 に答える
6

私の意見では、構成語彙を最小限に抑えることが重要です。休憩をなくして簡単に続けられるなら、そうします。

function foo ()
{
    var found = false;
    for(var k = 0; (k < 4 && !found); k++){
        for(var m = 0; (m < 4 && !found); m++){
           if( m === 2){
               found = true;
           }
        }
    }
    return found;
}

ループの後、mとkはあなたが思うかもしれない1つ大きいことに注意してください。これは、m++とk++がループ条件の前に実行されるためです。ただし、それでも「ダーティ」ブレイクよりはましです。

編集:長いコメント@Dennis .. ..

私は「ダーティ」であることを100%真剣に考えていたわけではありませんが、それでも「ブレーク」は私自身のクリーンなコードの概念に反していると思います。マルチレベルの休憩をとることを考えると、実際にシャワーを浴びているような気分になります。

私はすべての人生をコーディングしてきたので、コードについての感覚について私が意味することを正当化することがわかります。私がそれを考えることができる最も良い理由は、マナーと文法の組み合わせです。休憩は丁寧ではありません。マルチレベルの休憩は単なる失礼です。

forステートメントを見るとき、読者はどこを見ればよいかを正確に知っています。エンゲージメントのルールについて知る必要があるすべては、括弧の間にある契約にあります。読者として、私を侮辱し、だまされたような気がします。

明晰さは不正行為よりもはるかに尊重されます。

于 2011-06-04T10:07:23.053 に答える
4

マルチレベルループに関数を使用する-これは良い方法です:

function find_dup () {
    for (;;) {
        for(;;) {
            if (done) return;
        }
    }
}
于 2009-10-14T09:16:52.053 に答える
4

自己実行関数でラップして戻ります

(function(){
    for(i=0;i<5;i++){
        for (j=0;j<3;j++){
            //console.log(i+' '+j);
            if (j == 2) return;
        }
    }
})()
于 2014-05-21T23:26:34.637 に答える
2

ネストされたループをreturn「壊す」 。for

function foo ()
{
    //dance:
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                //break dance;
                return;
            }
        }
    }
}
foo();
于 2015-07-17T08:29:27.420 に答える
0

ネストされたforループは、「break」という単語で分割できます。ラベルなしで機能します。

あなたの場合、あなたはループを壊すのに十分な条件を持っている必要があります。

次に例を示します。

var arr = [[1,3], [5,6], [9,10]];
for (var a = 0; a<arr.length; a++ ){
  for (var i=0; i<arr[a].length; i++) {
    console.log('I am a nested loop and i = ' + i);
    if (i==0) { break; }
  }
  console.log('first loop continues');
}

以下をログに記録します。

> I am a nested loop and i = 0 
> first loop continues
> I am a nested loop and i = 0 
> first loop continues
> I am a nested loop and i = 0 
> first loop continues

リターン; この場合、ステートメントは機能しません。 作業ペン

于 2017-06-10T21:24:47.957 に答える
0

もう1つのトリックは、親ループを最後に到達するように設定してから、現在のループを中断することです。

function foo()
{
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                k = 5; // Set this then break
                break;
            }
          console.log(m);
        }
    }
}
于 2018-01-30T16:26:56.383 に答える
-1

breakパラメータを取りません。2つの回避策があります。

  1. それらを関数でラップして呼び出しますreturn

  2. 内側のループにフラグを設定し、フラグが設定されている場合はループの直後に再度ブレークします。

于 2009-10-14T07:47:04.653 に答える
-1

最初のループを解除します。

for(i=0;i<5;i++)
{
  for(j=i+1;j<5;j++)
  {
    //do something

    break;
  }
  alert(1);
};

両方のループを解除します。

for(i=0;i<5;i++)
{
  var breakagain = false;
  for(j=i+1;j<5;j++)
  {
    //do something

    breakagain = true;
    break;
  }
  alert(1);
  if(breakagain)
    break;
};
于 2009-10-14T07:48:02.940 に答える
-8
function myFunction(){
  for(var i = 0;i < n;i++){
    for(var m = 0;m < n;m++){
      if(/*break condition*/){
        goto out;
      }
    }
  }
out:
 //your out of the loop;
}
于 2009-10-14T07:55:38.260 に答える