Quelle est la meilleure façon de rompre avec les boucles imbriquées en Javascript?
//Write the links to the page.
for (var x = 0; x < Args.length; x++)
{
for (var Heading in Navigation.Headings)
{
for (var Item in Navigation.Headings[Heading])
{
if (Args[x] == Navigation.Headings[Heading][Item].Name)
{
document.write("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
break; // <---HERE, I need to break out of two loops.
}
}
}
}
javascript
loops
nested-loops
break
Gary Willoughby
la source
la source
Réponses:
Tout comme Perl,
comme défini dans EMCA-262 section 12.12. [MDN Docs]
Contrairement à C, ces étiquettes ne peuvent être utilisées que pour
continue
etbreak
, comme Javascript ne l'est pasgoto
.la source
continue
etbreak
.Enveloppez cela dans une fonction, puis juste
return
.la source
Je suis un peu en retard à la fête, mais ce qui suit est une approche indépendante du langage qui n'utilise pas GOTO / labels ou wrapping de fonction:
À la hausse, il coule naturellement, ce qui devrait plaire à la foule non-GOTO. Sur le plan négatif, la boucle interne doit terminer l'itération actuelle avant de se terminer, de sorte qu'elle pourrait ne pas être applicable dans certains scénarios.
la source
break
oucontinue
immédiatement après avoir défini z et y? J'aime l'idée d'utiliser lesfor
conditions de la boucle pour démarrer. Élégant à sa manière.Je me rends compte que c'est un sujet vraiment ancien, mais comme mon approche standard n'est pas encore là, j'ai pensé le poster pour les futurs googleurs.
la source
condition
évalue àtrue
la première itération de la boucle imbriquée, vous exécutez toujours les 10 autres itérations, en vérifiant laabort
valeur à chaque fois. Ce n'est pas un problème de performances pour 10 itérations, mais ce serait avec, disons, 10 000.abort
et l'expression. Dans des scénarios simples, cela pourrait être bien, mais pour d'énormes boucles avec des itérations de gazillions qui pourraient être un problèmeComment ça? :)
la source
x
, si une logique dans la boucle fait référence à x à un moment ultérieur (par exemple, elle définit une fonction anonyme interne qui est enregistrée et exécutée plus tard), la valeur de x sera ce qu'elle était à la fin de la boucle, pas l'index pendant lequel la fonction a été définie. (suite)x
en paramètre à votre fonction anonyme afin qu'elle en crée une nouvelle copie, qui peut ensuite être référencée comme une fermeture car elle ne changera pas à partir de ce moment. En bref, je recommande la réponse de l'éphémient.Assez facile:
la source
loop1=loop2=false;
Voici cinq façons de sortir des boucles imbriquées en JavaScript:
1) Définissez la boucle parent (s) à la fin
2) Utilisez une étiquette
3) Utiliser une variable
4) Utiliser la fonction auto-exécutable
5) Utilisez la fonction régulière
la source
break 2;
comme nous l'avons en PHP. Pas d'étiquettes de boucle, pas de fonctions, pas de vérifications if-else, pas de tempérage avec / dynamitage des variables de boucle - juste une syntaxe propre!Que diriez-vous de n'utiliser aucune interruption, aucun indicateur d'abandon et aucun contrôle de condition supplémentaire. Cette version blastes juste les variables de boucle (les fait
Number.MAX_VALUE
) lorsque la condition est remplie et force toutes les boucles à se terminer avec élégance.Il y avait une réponse similaire pour les boucles imbriquées de type décrémentation, mais cela fonctionne pour les boucles imbriquées de type incrémentation sans avoir à prendre en compte la valeur de terminaison de chaque boucle pour les boucles simples.
Un autre exemple:
la source
Que diriez-vous de pousser les boucles à leurs limites
la source
Si vous utilisez Coffeescript, il existe un mot clé "do" pratique qui facilite la définition et l'exécution immédiate d'une fonction anonyme:
... vous pouvez donc simplement utiliser "retour" pour sortir des boucles.
la source
for
boucles et non deux.Je pensais que je montrerais une approche de programmation fonctionnelle. Vous pouvez sortir des fonctions imbriquées Array.prototype.some () et / ou Array.prototype.every (), comme dans mes solutions. Un avantage supplémentaire de cette approche est qu'elle
Object.keys()
énumère uniquement les propriétés énumérables d'un objet, tandis que "une boucle for-in énumère également les propriétés de la chaîne de prototypes" .Proche de la solution OP:
Solution qui réduit l'itération sur les en-têtes / articles:
la source
Déjà mentionné précédemment par swilliams , mais avec un exemple ci-dessous (Javascript):
la source
Hmmm salut à la fête des 10 ans?
Pourquoi ne pas mettre une condition dans votre?
Comme ça tu t'arrêtes quand tu veux
Dans mon cas, en utilisant Typescript, nous pouvons utiliser certains () qui passent par le tableau et s'arrêtent lorsque la condition est remplie Donc mon code devient comme ceci:
Comme ça, la boucle s'est arrêtée juste après que la condition soit remplie
Rappel: ce code s'exécute en TypeScript
la source
la source
la meilleure façon est -
1) Trier les deux tableaux qui sont utilisés dans la première et la deuxième boucle.
2) si l'élément correspond, rompez la boucle intérieure et maintenez la valeur d'index.
3) au début de l'itération suivante, lancer la boucle interne avec une valeur d'index de maintien.
la source