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?
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;
}
}
}
}
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);
}
Voir Aaron. Autrement: j=5;i=5
au lieu de break
.
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!
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();
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:
À 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.
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;
}
}
})()
Utilisez la fonction pour les boucles multiniveaux - c’est un bon moyen:
function find_dup () {
for (;;) {
for(;;) {
if (done) return;
}
}
}
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();
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
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);
}
}
}
break
ne prend pas de paramètres. Il existe deux solutions de contournement:
Enveloppez-les dans une fonction et appelez return
Définissez un drapeau dans la boucle intérieure et rompez à nouveau juste après la boucle si le drapeau est défini.