562

Javascriptでネストされたループから抜け出す最良の方法は何ですか?

//Write the links to the page.
for (var x = 0; x < Args.length; x++)
{
   for (var Heading in Navigation.Headings)
   {
      for (var Item in Navigation.Headings[Heading])
      {
         if (Args[x] == Navigation.Headings[Heading][Item].Name)
         {
            document.write("<a href=\"" 
               + Navigation.Headings[Heading][Item].URL + "\">" 
               + Navigation.Headings[Heading][Item].Name + "</a> : ");
            break; // <---HERE, I need to break out of two loops.
         }
      }
   }
}
4

17 に答える 17

1282

パールと同じように、

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

EMCA-262 セクション 12.12 で定義されているとおり。[MDN ドキュメント]

C とは異なり、Javascript には がないため、これらのラベルはcontinueとにのみ使用できます。breakgoto

于 2008-10-08T14:53:40.720 に答える
203

それを関数にラップしてから、return.

于 2008-10-08T14:48:12.837 に答える
98

私はパーティーに少し遅れていますが、以下は、GOTO/ラベルまたは関数ラッピングを使用しない、言語に依存しないアプローチです。

for (var x = Set1.length; x > 0; x--)
{
   for (var y = Set2.length; y > 0; y--)
   {
      for (var z = Set3.length; z > 0; z--)
      {
          z = y = -1; // terminates second loop
          // z = y = x = -1; // terminate first loop
      }
   }
}

逆に言えば、GOTO 以外のユーザーを喜ばせる自然な流れです。欠点として、内側のループは終了する前に現在の反復を完了する必要があるため、一部のシナリオでは適用できない場合があります。

于 2009-04-07T22:11:59.637 に答える
79

これは非常に古いトピックだと思いますが、私の標準的なアプローチはまだここにないので、将来のグーグル社員のために投稿すると思いました.

var a, b, abort = false;
for (a = 0; a < 10 && !abort; a++) {
    for (b = 0; b < 10 && !abort; b++) {
        if (condition) {
            doSomeThing();
            abort = true;
        }
    }
}
于 2013-11-01T19:33:54.677 に答える
55

非常に簡単です:

var a = [1, 2, 3];
var b = [4, 5, 6];
var breakCheck1 = false;

for (var i in a) {
    for (var j in b) {
        breakCheck1 = true;
        break;
    }
    if (breakCheck1) break;
}
于 2009-07-16T15:22:31.843 に答える
42
var str = "";
for (var x = 0; x < 3; x++) {
    (function() {  // here's an anonymous function
        for (var y = 0; y < 3; y++) {
            for (var z = 0; z < 3; z++) {
                // you have access to 'x' because of closures
                str += "x=" + x + "  y=" + y + "  z=" + z + "<br />";
                if (x == z && z == 2) {
                    return;
                }
            }
        }
    })();  // here, you execute your anonymous function
}

どのようだ?:)

于 2008-10-08T19:42:23.413 に答える
41

JavaScript でネストされたループから抜け出す 5 つの方法を次に示します。

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

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

2) 使用ラベル

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

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-12-30T22:25:24.023 に答える
3

Coffeescript を使用する場合、無名関数を簡単に定義してすぐに実行できる便利な "do" キーワードがあります。

do ->
  for a in first_loop
    for b in second_loop
      if condition(...)
        return

...そのため、単純に「return」を使用してループから抜け出すことができます。

于 2015-08-10T20:46:35.960 に答える
-3
XXX.Validation = function() {
    var ok = false;
loop:
    do {
        for (...) {
            while (...) {
                if (...) {
                    break loop; // Exist the outermost do-while loop
                }
                if (...) {
                    continue; // skips current iteration in the while loop
                }
            }
        }
        if (...) {
            break loop;
        }
        if (...) {
            break loop;
        }
        if (...) {
            break loop;
        }
        if (...) {
            break loop;
        }
        ok = true;
        break;
    } while(true);
    CleanupAndCallbackBeforeReturning(ok);
    return ok;
};
于 2012-07-12T22:16:16.467 に答える
-5

最善の方法は -
1) 最初と 2 番目のループで使用される両方の配列を並べ替えます。
2) 項目が一致した場合、内側のループを中断し、インデックス値を保持します。
3) 次の反復を開始するとき、ホールド インデックス値で内部ループを開始します。

于 2016-06-23T17:59:58.490 に答える