web-dev-qa-db-fra.com

Comment casser des 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 pourrais-je casser une boucle imbriquée en JavaScript?

186
Mask

Vous devriez être capable de casser une étiquette, comme ceci:

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

Vous devez nommer votre boucle externe et la casser, plutôt que votre boucle interne - comme ceci.

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

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

27
Glenn
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é à partir de meilleur moyen de rompre les boucles imbriquées en Javascript?

Veuillez effectuer une recherche avant de poser une question. Le lien était la PREMIÈRE question connexe que j'ai vue à gauche de cette page!

18
Jim

Il existe au moins cinq manières différentes de sortir de deux boucles ou plus:

1) Placez la boucle parent (s) à la fin

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

2) Utiliser l'étiquette

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

) 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) Utiliser la fonction d'exécution automatique

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

5) Utiliser la fonction régulière

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

Malheureusement, vous devrez définir un drapeau ou utiliser des étiquettes (pensez aux déclarations old school 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)
};

L'approche de l'étiquette 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.

regarde aussi:

11
Jonathan Fingland

À mon avis, il est important de garder votre vocabulaire de construction au minimum. Si je peux me passer des 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 averti, après la boucle, m et k sont plus grands que vous ne le pensez. En effet, m ++ et k ++ sont exécutés avant leurs conditions de boucle. Cependant, c'est toujours mieux que les pauses "sales".

EDIT: long comment @Dennis ...

Je n'étais pas vraiment sérieux à propos d'être "sale", mais je pense toujours que "casser" va à l'encontre de ma propre conception du code propre. La pensée d'avoir des pauses à plusieurs niveaux me donne vraiment envie de prendre une douche.

Je trouve justifiant ce que je veux dire par un sentiment concernant le code parce que j'ai codé toute la vie. La meilleure raison pour laquelle je peux en penser est une combinaison de manières et de grammaire. Les pauses ne sont tout simplement pas polies. Les pauses à plusieurs niveaux sont simplement grossières.

En regardant une déclaration for, un lecteur sait exactement où chercher. Tout ce que vous devez savoir sur les règles d’engagement se trouve dans le contrat, entre les parenthèses. En tant que lecteur, les pauses m'insultent, c'est comme si on m'avait trompé.

La clarté est beaucoup plus respectueuse que la triche.

6
thomas-peter

Envelopper dans une fonction auto-exécutante et retourner

(function(){
    for(i=0;i<5;i++){
        for (j=0;j<3;j++){
            //console.log(i+' '+j);
            if (j == 2) return;
        }
    }
})()
5
kehers

Utilisez la fonction pour les boucles multiniveaux - c’est un bon moyen:

function find_dup () {
    for (;;) {
        for(;;) {
            if (done) return;
        }
    }
}
4
Anatoliy

Vous return pour "casser" votre boucle imbriquée 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();
2
GibboK

Vous pouvez casser des boucles imbriquées avec le mot "break" , cela fonctionne sans étiquette.

Dans votre cas, vous devez avoir une condition suffisante pour rompre 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 les éléments suivants:

> 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

L'instruction return; ne fonctionne pas dans ce cas. stylo de travail

0
Ilya Kushlianski

Une autre astuce consiste à définir la boucle parente pour atteindre la fin, puis casser la boucle en cours

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
StefansArya

break ne prend pas de paramètres. Il existe deux solutions de contournement:

  1. Enveloppez-les dans une fonction et appelez return

  2. Définissez un drapeau dans la boucle intérieure et rompez à nouveau juste après la boucle si le drapeau est défini.

0
Aaron Digulla