36

What command I must use, to get out of the for loop, also from //code inside jump direct to //code after

//code before
for(var a in b)
    {
    switch(something)
        {
        case something:
            {
            //code inside
            break;
            }
        }
    }
//code after
BASILIO
  • 847
  • 2
  • 12
  • 26

8 Answers8

38

You can use label. Have a labeled statement and break to that label. outerLoop is the label I have used here.

//code before
outerLoop:
for (var a in b) {
    switch (something) {
        case 'case1':
            //code inside
            break outerLoop;
    }
}
//code after
Neo
  • 4,145
  • 6
  • 53
  • 76
Chubby Boy
  • 30,942
  • 19
  • 47
  • 47
  • It's okay to use `label` once, but that might end up with a spaghetti code if you use it more often. In this situations I'd first recommend to refactor the solution instead. – Mahdi Jun 12 '13 at 18:34
  • 1
    yay! spaghetti! – Hicsy Jul 18 '20 at 08:20
28

use another variable to flag when you need to exit:

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

connexo
  • 53,704
  • 14
  • 91
  • 128
Brad Christie
  • 100,477
  • 16
  • 156
  • 200
  • 2
    @downvoter: what gives? Perfectly acceptable (and although `break` permits a `label` parameter, I personally think labels went out with BASIC and just lead to [spaghetti code](http://en.wikipedia.org/wiki/Spaghetti_code)...) – Brad Christie Jun 12 '13 at 18:28
19

Unfortunately, Javascript doesn't have allow breaking through multiple levels. The easiest way to do this is to leverage the power of the return statement by creating an anonymous function:

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

This works because return leaves the function and therefore implicitly leaves the loop, moving you straight to code after


As pointed out in the comments, my above answer is incorrect and it is possible to multi-level breaking, as in Chubby Boy's answer, which I have upvoted.

Whether this is wise is, from a seven-year-later perspective, somewhat questionable.

lonesomeday
  • 233,373
  • 50
  • 316
  • 318
  • 1
    I feel like an anonymous function is overkill for this kind of thing. Also, depending on how elaborate the for/switch can be, I might skim over the code and see a `return` and not associate it with the anonymous function (making maintenance a little more confusing later). Now, granted, this is not a complex piece of code, but applying this in practice throughout could become ugly fast. – Brad Christie Jun 12 '13 at 18:37
  • @BradChristie I'm not sure anonymous functions are so much of a big deal as to be overkill! As to the readability thing, that's what comments are for, surely... Refactoring would probably be the ideal, but this is the cleanest way to leave the loop. – lonesomeday Jun 12 '13 at 18:38
  • Not dramatic, but i [still see a difference](http://jsperf.com/exiting-nested-switch-within-for-in). – Brad Christie Jun 12 '13 at 18:47
  • @BradChristie Personally, when we're talking on the scale of 13,000,000 ops/sec, I'm not *too* worried! – lonesomeday Jun 12 '13 at 21:11
  • Untrue. Labels can be broken to. var b = 1; mySwitchLabel: switch(b) { case 1: for (var i=0; i<4; i++) { if (i === 0) { console.log('Break from Loop.') break mySwitchLabel; } } console.log('End of Case.') break; } – Liam Mitchell Oct 29 '20 at 01:29
  • 1
    @LiamMitchell Many thanks: you are, of course, correct. My answer has been edited to point to the correct one elsewhere on this page. – lonesomeday Oct 29 '20 at 17:05
9

it depends on what you want to accomplish... one thing I commonly do is something like this:

    //code before
for(var a in b)
{
    var breakFor = false;
    switch(something)
    {
        case something:
        {
            //code inside
            breakFor = true;
            break;
        }
    }
    if (breakFor)
        break;
}
//code after
BenMorel
  • 34,448
  • 50
  • 182
  • 322
Jeff
  • 111
  • 2
  • Jeff was the first that use a bool var to accomplish this and other user takes more upvotes using the same statement. Why? – Eduardo Jul 09 '15 at 22:35
3

You can tell which loop / switch to break.

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

See this answer.

Community
  • 1
  • 1
Skarlinski
  • 2,419
  • 11
  • 28
2

Replace your switch with a series of if statements.

for (const a of b) {
  if (something === someValue) {
    // code inside
    break; // break out of the for loop
  } else if (something === someOtherValue) {
    // etc.
  }
}
Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
1
for(var i=0; i<b.length; i++) {
   switch (something) {
       case 'something1':
           i=b.length;
   }
}

When the iteration variable i reaches the end of the loop, it breaks. But one can force the iteration variable to reach the end of the loop.

João Pimentel Ferreira
  • 14,289
  • 10
  • 80
  • 109
gest
  • 49
  • 2
  • It's better to include some explanation for this code, especially since there are six other answers. – EJoshuaS - Stand with Ukraine Mar 04 '17 at 18:31
  • This does not solve the problem because the code will run 1 more time when `i=b.length`. Moreover, it's very dangerous if `i` is set lower than `b.length`, that will run forever!!!. So I recommend we should use function, label or flag instead of this. – Trung Le Nguyen Nhat Aug 23 '17 at 10:13
  • @TrungLeNguyenNhat: the for loop condition looks for `b < length`, not `<=`, so once you set `i = b.length`, the condition will fail. The loop will not run one more time. In fact, even if you change it to `i = b.length - 1`, it will still break after this loop, because the incrementor runs before the condition. – user4815162342 Dec 13 '18 at 16:48
0

I always find using conditional statements one of the easiest ways to control the code flow, at least conceptually.

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
Andrew_CS
  • 2,542
  • 1
  • 18
  • 38