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

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

1) 将 parent(s) 循环设置到末尾

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 比您想象的要大。这是因为 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

您可以使用单词 '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

回报;语句在这种情况下不起作用。 工作笔

于 2017-06-10T21:24:47.957 回答
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);
        }
    }
}
于 2018-01-30T16:26:56.383 回答
-1

break不带参数。有两种解决方法:

  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 回答