javascript - infinito - for anidado netbeans
¿Cómo romper los bucles anidados en JavaScript? (14)
Intenté esto:
for(i = 0; i < 5; i++){
for(j = i + 1; j < 5; j++){
break(2);
}
alert(1);
}
solo para obtener:
SyntaxError
: falta;
declaración anterior
Entonces, ¿cómo rompería un bucle anidado en JavaScript?
Ajustar en una función autoejecutable y devolver
(function(){
for(i=0;i<5;i++){
for (j=0;j<3;j++){
//console.log(i+'' ''+j);
if (j == 2) return;
}
}
})()
Debe nombrar su bucle externo y romper ese bucle, en lugar de su bucle interno, como este.
outer_loop:
for(i=0;i<5;i++) {
for(j=i+1;j<5;j++) {
break outer_loop;
}
alert(1);
}
Debería poder romper con una etiqueta, así:
function foo ()
{
dance:
for(var k = 0; k < 4; k++){
for(var m = 0; m < 4; m++){
if(m == 2){
break dance;
}
}
}
}
Desafortunadamente, tendrás que establecer una bandera o usar etiquetas (piensa en las declaraciones de goto de la vieja escuela)
var breakout = false;
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
breakout = true;
break;
}
if (breakout) break;
alert(1)
};
El enfoque de la etiqueta se ve así:
end_loops:
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
break end_loops;
}
alert(1)
};
editar: etiqueta colocada incorrectamente.
ver también:
El otro truco es establecer el bucle principal para llegar al final y luego romper el bucle actual
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);
}
}
}
En mi opinión, es importante mantener tu vocabulario de construcción al mínimo. Si puedo eliminar los descansos y continuar con facilidad, lo hago.
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;
}
Ten en cuenta que, después del ciclo, myk son uno más grande de lo que crees. Esto se debe a que m ++ y k ++ se ejecutan antes de sus condiciones de bucle. Sin embargo, sigue siendo mejor que los descansos "sucios".
EDITAR: comentario largo @Dennis ...
No estaba siendo 100% serio acerca de ser ''sucio'', pero todavía creo que ''romper'' contraviene mi propia concepción del código limpio. La idea de tener descansos de varios niveles en realidad me da ganas de tomar una ducha.
Encuentro justificar lo que quiero decir sobre un sentimiento sobre el código porque he codificado toda la vida. Lo mejor por lo que puedo pensar es en una combinación de modales y gramática. Los descansos no son educados. Los saltos de niveles múltiples son simplemente groseros.
Al mirar una declaración, el lector sabe exactamente dónde buscar. Todo lo que necesita saber sobre las reglas de participación está en el contrato, entre paréntesis. Como lector, las rupturas me insultan, se siente como si me hubieran engañado.
La claridad es mucho más respetuosa que hacer trampa.
Mira a Aaron. De lo contrario: j=5;i=5
lugar de break
.
Romper el primer ciclo:
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
//do something
break;
}
alert(1);
};
Rompe ambos bucles:
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;
};
Utilice la función para bucles multinivel: esta es una buena forma:
function find_dup () {
for (;;) {
for(;;) {
if (done) return;
}
}
}
break
no toma los parámetros. Hay dos soluciones:
Envuélvalos en una función y llame a
return
Establezca una bandera en el bucle interno y rompa nuevamente justo después del bucle si se establece la bandera.
return
a "romper" anidado for
ciclo.
function foo ()
{
//dance:
for(var k = 0; k < 4; k++){
for(var m = 0; m < 4; m++){
if(m == 2){
//break dance;
return;
}
}
}
}
foo();
Puedes romper loops anidados con la palabra ''break'' , funciona sin etiquetas.
En su caso, debe tener una condición que sea suficiente para romper un ciclo.
Aquí hay un ejemplo:
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'');
}
Registra lo siguiente:
> 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
El regreso la declaración no funciona en este caso. Pluma de trabajo
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;
}
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
}
}
}
código copiado de la mejor manera de romper desde bucles anidados en Javascript?
Por favor busca antes de publicar una pregunta. ¡El enlace fue la PRIMERA pregunta relacionada que vi en el lado izquierdo de esta página!