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?
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;
}
}
}
}
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);
}
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!
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:
à 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.
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;
}
}
})()
utiliser la fonction pour les boucles à plusieurs niveaux - c'est une bonne façon:
function find_dup () {
for (;;) {
for(;;) {
if (done) return;
}
}
}
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();
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();
break
ne prend pas les paramètres. Il y a deux solutions de rechange:
-
enveloppez-les dans une fonction et appelez
return
-
placer un drapeau dans la boucle intérieure et le briser à nouveau juste après la boucle si le drapeau est placé.
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
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);
}
}
}
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;
};
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;
}