如何在JavaScript中打破嵌套循环?

Mas*_*ask 189 javascript break nested-loops

我试过这个:

for(i = 0; i < 5; i++){
    for(j = i + 1; j < 5; j++){
        break(2);
    }
    alert(1);
}
Run Code Online (Sandbox Code Playgroud)

只得到:

SyntaxError:;在陈述之前遗漏

那么,我如何打破JavaScript中的嵌套循环?

Noo*_*ilk 530

您应该能够打破标签,如下所示:

function foo ()
{
    dance:
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                break dance;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 霹雳舞哈哈 (20认同)
  • 还有一个事实是,JS 需要这个巨人参与*舞蹈*。其他语言给你一个“break”(字面意思是“break 2”)。 (3认同)

Fen*_*ton 40

您需要命名外部循环并打破该循环,而不是内部循环 - 就像这样.

outer_loop: 
for(i=0;i<5;i++) {
    for(j=i+1;j<5;j++) {
        break outer_loop;
    }
    alert(1);
}
Run Code Online (Sandbox Code Playgroud)

  • @okw:你没有给循环命名.您只需标记源中的位置即可. (11认同)
  • @xtofl:不完全是.通过将标签放在之前,可以将标签与语句(可以是循环)相关联.它仅对块语句有用,因为标签仅在块中的break和continue语句中可用. (8认同)
  • 从不知道JavaScript支持的标签.我想知道为什么我以前从未见过这个.:o (6认同)
  • 哇,我不知道我们可以命名循环,很棒的信息!+1 (2认同)
  • @NickFitz:你可以为它做一个性能论证.在嵌套循环的情况下,标签可以用于打破外部循环.虽然通过将内部循环移动到单独的函数来避免嵌套循环可能更优雅和模块化,但由于额外的函数调用,它将稍微慢一些. (2认同)

Gle*_*enn 27

见亚伦的.否则: j=5;i=5而不是break.

  • 丑陋是主观的。该循环应该运行任意多次。问题是如何打破双循环,因为j或i都没有达到5。赞成我的vs“霹雳舞”的唯一技术原因是您希望i / j显示完成(== 5) )vs不完整(== &lt;5)的循环后。 (2认同)

Jim*_*Jim 20

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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Javascript中嵌套循环的最佳破解方式复制的代码

请在发布问题前进行搜索.该链接是我在本页左侧看到的第一个相关问题!


Dan*_*ray 17

至少有五种不同的方法可以打破两个或更多循环:

1)将父循环设置为结尾

for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
        {
            i = 5;
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2)使用标签

fast:
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
            break fast;
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

4)使用自执行功能

(function()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

5)使用常规功能

function nested_loops()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
}
nested_loops();
Run Code Online (Sandbox Code Playgroud)

  • 多级中断的重点是避免#3。 (5认同)
  • 「快吃早饭」 (3认同)

Jon*_*and 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)
};
Run Code Online (Sandbox Code Playgroud)

标签方法如下:

end_loops:
for(i=0;i<5;i++)
{
    for(j=i+1;j<5;j++)
    {
        break end_loops;
    }
    alert(1)
};
Run Code Online (Sandbox Code Playgroud)

编辑:标签放置错误.

另见:


tho*_*ter 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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在循环之后,m和k是您可能想到的更大的一个.这是因为m ++和k ++在它们的循环条件之前执行.然而,它仍然比"肮脏"休息更好.

编辑:长评@Dennis ......

我并不是100%认真对待'肮脏',但我仍然认为'休息'违反了我自己的干净代码概念.多层次休息的想法实际上让我感觉像是在洗澡.

我发现我对代码的感觉是正确的,因为我已经编码了所有生命.我能想到的最好的原因是礼仪和语法的结合.休息只是不礼貌.多级休息很简单.

在查看for语句时,读者确切地知道要查找的位置.您需要了解的有关参与规则的所有内容都在合同中,在括号之间.作为读者,打破侮辱我,感觉就像我被骗了.

清晰度比作弊更加尊重.


Ana*_*liy 5

使用函数进行多级循环 - 这是好方法:

function find_dup () {
    for (;;) {
        for(;;) {
            if (done) return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 无限循环:) 就像 while (true) {} (3认同)