【问题标题】:Break for loop from inside of switch case in Javascript从Javascript中的switch case内部中断for循环
【发布时间】:2013-06-08 23:38:13
【问题描述】:

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

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

【问题讨论】:

  • 在 switch 语句的结束 } 之后添加 break;
  • 你可以考虑重构你的解决方案。
  • @Jaak Kütt 永远不要碰我的缩进样式。
  • @BASILIO 不要用“i”-s 和“sue”-s 来引起注意 :).. 你至少会考虑在最内部的评论中添加额外的缩进和中断吗?
  • @Jaak Kütt Ещё раз и по русский пожалуйста。

标签: javascript for-loop switch-statement continue


【解决方案1】:

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

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');

example

【讨论】:

  • @downvoter:什么给了?完全可以接受(虽然break 允许label 参数,但我个人认为标签与BASIC 一起使用,只会导致spaghetti code...)
【解决方案2】:

这取决于你想要完成什么......我通常做的一件事是这样的:

    //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 var 来完成此任务的人,而其他用户使用相同的语句获得了更多的支持。为什么?
【解决方案3】:

您可以使用label。有一个带标签的声明并打破该标签。 outerLoop 是我这里使用的标签。

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

【讨论】:

  • 可以使用一次label,但如果您更频繁地使用它,最终可能会出现意大利面条代码。在这种情况下,我首先建议改为重构解决方案。
  • 耶!意大利面!
【解决方案4】:

不幸的是,Javascript 不允许breaking 通过多个级别。最简单的方法是通过创建匿名函数来利用 return 语句的强大功能:

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

这是有效的,因为return 离开了函数,因此隐式地离开了循环,将您直接移动到code after


正如 cmets 中所指出的,我上面的答案是不正确的,可以使用多级 breaking,如 Chubby Boy's answer,我已投赞成票。

这是否是明智的,从七年后的角度来看,有点值得怀疑。

【讨论】:

  • 我觉得匿名函数对于这种事情来说太过分了。此外,根据 for/switch 的复杂程度,我可能会浏览代码并看到 return 并且不将其与匿名函数相关联(稍后使维护更加混乱)。现在,当然,这不是一段复杂的代码,但在实践中应用它可能会很快变得丑陋。
  • @BradChristie 我不确定匿名函数是否重要到过分!至于可读性,这就是 cmets 的用途,当然……重构可能是理想的,但这是离开循环的最干净的方法。
  • 没有戏剧性,但我still see a difference
  • @BradChristie 就我个人而言,当我们谈论 13,000,000 次操作/秒的规模时,我并没有担心!
  • @LiamMitchell 非常感谢:您当然是正确的。我的答案已被编辑为指向此页面其他地方的正确答案。
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

    您可以判断要中断哪个循环/开关。

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

    this answer

    【讨论】:

      【解决方案7】:
      for(var i=0; i<b.length; i++) {
         switch (something) {
             case 'something1':
                 i=b.length;
         }
      }
      

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

      【讨论】:

      • 最好包含一些对此代码的解释,特别是因为还有其他六个答案。
      • 这并不能解决问题,因为当i=b.length 时代码会多运行1 次。而且,如果i 设置为低于b.length 是非常危险的,这将永远运行!!!。所以我建议我们应该使用函数、标签或标志来代替这个。
      • @TrungLeNguyenNhat:for 循环条件寻找的是b &lt; length,而不是&lt;=,所以一旦你设置了i = b.length,条件就会失败。循环不会再运行一次。事实上,即使你把它改成i = b.length - 1,在这个循环之后它仍然会中断,因为增量器在条件之前运行。
      【解决方案8】:

      用一系列if 语句替换您的switch

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 2013-06-07
        • 1970-01-01
        相关资源
        最近更新 更多