Comment casser les boucles imbriquées en JavaScript?

j'ai essayé ceci:

for(i = 0; i < 5; i++){
    for(j = i + 1; j < 5; j++){
        break(2);
    }
    alert(1);
}

seulement pour obtenir:

SyntaxError : manquant ; avant la déclaration

alors, comment briser une boucle imbriquée en JavaScript?

162
demandé sur Xufox 2009-10-14 11:42:47

15 réponses

Vous devriez être en mesure de briser une étiquette, comme suit:

function foo ()
{
    dance:
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                break dance;
            }
        }
    }
}
461
répondu Noon Silk 2009-10-14 08:24:33

vous devez nommer votre boucle extérieure et briser cette boucle, plutôt que votre boucle intérieure - comme ceci.

outer_loop: 
for(i=0;i<5;i++) {
    for(j=i+1;j<5;j++) {
        break outer_loop;
    }
    alert(1);
}
31
répondu user75525 2009-10-14 07:49:27

voir Aaron. Autrement: j=5;i=5 au lieu de break .

22
répondu Glenn 2009-10-14 07:49:57
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
            }
        }
    }

code copié de meilleure façon de rompre avec les boucles imbriquées en Javascript?

s'il vous Plaît faire une recherche avant de poster une question. Le lien a été la PREMIÈRE question j'ai vu sur le côté gauche de cette page!

13
répondu Jim 2017-05-23 12:10:32

malheureusement, vous aurez à mettre un drapeau ou d'utiliser des étiquettes (pensez à la vieille école Goto déclarations)

var breakout = false;

for(i=0;i<5;i++)
{
    for(j=i+1;j<5;j++)
    {
        breakout = true;
        break;
    }
    if (breakout) break;
    alert(1)
};

L'étiquette approche ressemble à:

end_loops:
for(i=0;i<5;i++)
{
    for(j=i+1;j<5;j++)
    {
        break end_loops;
    }
    alert(1)
};

edit: étiquette mal placée.

voir aussi:

10
répondu Jonathan Fingland 2013-08-08 20:27:27

à mon avis, il est important de garder votre vocabulaire construit au minimum. Si je peux supprimer les pauses et continuer facilement, je le fais.

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;
}

soyez avertis, après la boucle, m et k sont un plus grand que vous pourriez penser. C'est parce que m++ et k++ sont exécutés avant leurs conditions de boucle. Cependant, c'est toujours mieux que des pauses "sales".

EDIT: long comment @Dennis...

Je n'étais pas sérieux à 100% sur le fait d'être "sale", mais je pense toujours que "break" va à l'encontre de ma propre conception du code propre. L'idée d'avoir des pauses multi-niveaux me donne envie de prendre une douche.

je trouve justifier ce que je veux dire à propos d'un sentiment sur le code parce que j'ai codé toute la vie. La meilleure raison pour laquelle je peux y penser est une combinaison de manières et de grammaire. Les pauses ne sont pas polis. Les sauts multi-niveaux sont tout simplement grossiers.

en regardant un déclaration, un lecteur sait exactement où regarder. Tout ce que vous devez savoir sur les règles d'engagement sont dans le contrat, entre les parenthèses. En tant que lecteur, les pauses m'insultent, j'ai l'impression d'avoir été trompé.

la clarté est beaucoup plus respectueuse que la tricherie.

6
répondu thomas-peter 2012-07-13 12:05:11

Enveloppez-les dans une auto de l'exécution de la fonction et de retour

(function(){
    for(i=0;i<5;i++){
        for (j=0;j<3;j++){
            //console.log(i+' '+j);
            if (j == 2) return;
        }
    }
})()
5
répondu kehers 2014-05-21 23:26:34

utiliser la fonction pour les boucles à plusieurs niveaux - c'est une bonne façon:

function find_dup () {
    for (;;) {
        for(;;) {
            if (done) return;
        }
    }
}
4
répondu Anatoliy 2009-10-14 09:16:52

Vous return à "casser" vous imbriquée for en boucle.

function foo ()
{
    //dance:
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                //break dance;
                return;
            }
        }
    }
}
foo();
2
répondu GibboK 2016-07-20 14:41:17

il y a au moins cinq façons différentes de sortir de deux boucles ou plus:

1) Régler la boucle parent(s) à la fin de

for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
        {
            i = 5;
            break;
        }
    }
}

2) Utiliser l'étiquette

exit_loops:
for (i = 0; i < 5; i++)
{
    for (j = 0; j < 5; j++)
    {
        if (j === 2)
            break exit_loops;
    }
}

3) utiliser la variable

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) Use fonction auto-exécutante

(function()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
})();

5) L'utilisation régulière de la fonction

function nested_loops()
{
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
             if (j === 2)
                 return;
        }
    }
}
nested_loops();
2
répondu Dan Bray 2018-08-05 12:31:50

break ne prend pas les paramètres. Il y a deux solutions de rechange:

  1. enveloppez-les dans une fonction et appelez return

  2. placer un drapeau dans la boucle intérieure et le briser à nouveau juste après la boucle si le drapeau est placé.

0
répondu Aaron Digulla 2009-10-14 07:47:04

vous pouvez briser emboîté pour les boucles avec le mot "break " , il fonctionne sans aucune étiquette.

Dans votre cas, vous devez avoir une condition qui est suffisant pour briser une boucle.

voici un exemple:

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

Il enregistre le texte suivant:

> 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

le retour; énoncé ne fonctionne pas dans ce cas. stylo de travail

0
répondu Ilya Kushlianski 2017-06-10 21:24:47

une autre astuce consiste à régler la boucle mère pour atteindre l'extrémité et ensuite briser la boucle actuelle.""

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);
        }
    }
}
0
répondu StefansArya 2018-01-30 16:26:56

Pause 1ère boucle:

for(i=0;i<5;i++)
{
  for(j=i+1;j<5;j++)
  {
    //do something

    break;
  }
  alert(1);
};

Casser les deux boucles:

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;
};
-1
répondu o.k.w 2009-10-14 07:48:02
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;
}
-8
répondu junmats 2009-10-14 07:55:38