web-dev-qa-db-ja.com

JavaScriptでネストされたループを解除する方法は?

私はこれを試しました:

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

取得のみ:

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

それでは、JavaScriptでネストされたループをどのように破りますか?

186
Mask

次のように、ラベルにブレークできるはずです。

function foo ()
{
    dance:
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                break dance;
            }
        }
    }
}
522
Noon Silk

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

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

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

27
Glenn
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のネストされたループから抜ける最良の方法? からコピーされたコード

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

18
Jim

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;
    }
}

)変数を使用

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();
16
Dan Bray

残念ながら、フラグを設定するか、ラベルを使用する必要があります(古い学校の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)
};

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

また見なさい:

11

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

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%真剣に取り組んでいませんでしたが、それでも「break」はクリーンコードの私自身の概念に反すると思います。複数レベルの休憩をとるという考えは、実際にシャワーを浴びているような気分にさせます。

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

For文を見ると、読者はどこを見るべきかを正確に知っています。エンゲージメントのルールについて知っておく必要があることはすべて、括弧内の契約にあります。読者として、私をs辱することを破る、それは私がだまされているように感じます。

明快さは不正行為よりもはるかに敬意を表しています。

6
thomas-peter

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

(function(){
    for(i=0;i<5;i++){
        for (j=0;j<3;j++){
            //console.log(i+' '+j);
            if (j == 2) return;
        }
    }
})()
5
kehers

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

function find_dup () {
    for (;;) {
        for(;;) {
            if (done) return;
        }
    }
}
4
Anatoliy

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();
2
GibboK

Wordの「break」でネストされたforループをブレークできます。ラベルなしで機能します。

あなたの場合、ループを中断するのに十分な条件が必要です。

以下に例を示します。

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

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

0

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

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);
        }
    }
}
0
StefansArya

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

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

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

0
Aaron Digulla