在Javascript中如何从switch case语句内部跳出for循环

37

我必须使用什么命令才能跳出for循环,同时从//code inside直接跳到//code after

//code before
for(var a in b)
    {
    switch(something)
        {
        case something:
            {
            //code inside
            break;
            }
        }
    }
//code after

在 switch 语句的右括号 } 后面添加 break; - War10ck
3
你可以考虑重构你的解决方案。 - Mahdi
1
@Jaak Kütt 别碰我的缩进风格。 - BASILIO
@BASILIO 不要用 "i" 和 "sue" 来引起注意 :).. 你能否考虑给最内部的注释和换行添加额外的缩进? - Jaak Kütt
@Jaak Kütt,请再用俄语说一遍。 - BASILIO
8个回答

40
你可以使用 label。拥有带标签的语句并跳出该标签。在这里我使用了outerLoop作为标签名。
//code before
outerLoop:
for (var a in b) {
    switch (something) {
        case 'case1':
            //code inside
            break outerLoop;
    }
}
//code after

使用 label 一次是可以的,但如果你经常使用它,代码可能会变得混乱。在这种情况下,我首先建议重构解决方案。 - Mahdi
1
耶!意大利面! - Hicsy

28

使用另一个变量来标记需要退出的时候:

var b = { firstName: 'Peter', lastName: 'Smith' };
var keepGoing = true;
for (var a in b) {
  switch (true) {
    case 1:
      keepGoing = false;
      break;
  }
  if (!keepGoing) break;
  console.log('switch end');
}
console.log('for end');

示例


2
@downvoter: 怎么了?这是完全可以接受的(尽管break允许使用label参数,但我个人认为标签已经随着BASIC而过时,并且只会导致意大利面式代码...) - Brad Christie

19

不幸的是,JavaScript无法允许通过多个级别的break。最简单的方法是利用return语句的威力来创建一个匿名函数:

//code before
(function () {
    for (var a in b) {
        switch (something) {
        case something:
            {
                //code inside
                return;
            }
        }
    }
}());
//code after

这个代码之所以能够正常执行,是因为return语句使函数结束,从而隐式地结束了循环,直接跳到了code after之后的代码。


正如评论中指出的那样,我上面的回答是不正确的。就像 Chubby Boy 的回答中所示,多层级的break是可能的,我已经投了赞同票。

然而,从七年后的视角来看,这样做是否明智还有待商榷。


1
我觉得对于这种情况,匿名函数有点过度了。此外,根据for/switch的复杂程度不同,我可能会在代码中快速浏览并看到一个 return ,并不会将其与匿名函数关联起来(使维护稍后更加困难)。当然,这并不是一段复杂的代码,但是在实践中应用它可能很快就变得丑陋。 - Brad Christie
@BradChristie 我不确定匿名函数是否如此重要,以至于过度使用!至于可读性问题,这就是注释的作用,不是吗... 重构可能是理想的选择,但这是留下循环最清晰的方法。 - lonesomeday
虽然不是很显著,但我仍然看到了差异。 - Brad Christie
@BradChristie 在我们谈论每秒操作次数达到1300万的规模时,我并不是太担心! - lonesomeday
不正确的。 标签可以被打破。var b = 1; mySwitchLabel: switch(b) { case 1: for (var i=0; i<4; i++) { if (i === 0) { console.log('从循环中断。') break mySwitchLabel; } } console.log('结束 Case。') break; } - Liam Mitchell
1
@LiamMitchell 非常感谢:您当然是正确的。我的答案已经被编辑,指向了本页面上正确的答案。 - lonesomeday

9

这要取决于你想要实现什么... 我常常做的一件事是像这样:

    //code before
for(var a in b)
{
    var breakFor = false;
    switch(something)
    {
        case something:
        {
            //code inside
            breakFor = true;
            break;
        }
    }
    if (breakFor)
        break;
}
//code after

Jeff是第一个使用bool变量来完成这个任务的人,其他用户也使用了相同的语句并获得了更多的赞同。为什么呢? - Eduardo

3
你可以确定要中断哪个循环/开关。
function foo ()
{
    dance:
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                break dance;
            }
        }
    }
}

请参考这个答案


2

用一系列if语句替换你的switch语句。

for (const a of b) {
  if (something === someValue) {
    // code inside
    break; // break out of the for loop
  } else if (something === someOtherValue) {
    // etc.
  }
}

1
for(var i=0; i<b.length; i++) {
   switch (something) {
       case 'something1':
           i=b.length;
   }
}

当迭代变量i到达循环的末尾时,它会停止。但是可以强制迭代变量到达循环的末尾。

最好为这段代码提供一些解释,特别是因为还有其他六个答案。 - EJoshuaS - Stand with Ukraine
这并不能解决问题,因为当 i=b.length 时,代码将再次运行1次。此外,如果将 i 设置为小于 b.length,那么它将永远运行,非常危险!因此,我建议我们应该使用函数、标签或标志来代替这个方法。 - Trung Le Nguyen Nhat
@TrungLeNguyenNhat:for循环的条件是寻找b < length,而不是<=,所以一旦你设置了i = b.length,条件就会失败。循环将不会再运行一次。实际上,即使你将其更改为i = b.length - 1,它仍然会在此循环后中断,因为增量器在条件之前运行。 - user4815162342

0

我总是觉得使用条件语句是控制代码流程最简单的方法之一,至少在概念上是这样。

var done = false;
//code before for loop
for(var a in b){
    switch(switchParameter){
        case firstCase:
            //code inside
            done = true;
            break;
        }
    }
    if(done)
        break;
}
//code outside of for loop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接