¿Cuál es la mejor manera de romper los bucles anidados 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
fuente
fuente
Respuestas:
Al igual que Perl,
como se define en EMCA-262 sección 12.12. [Documentos de MDN]
A diferencia de C, estas etiquetas solo se pueden usar
continue
ybreak
, como Javascript no tienegoto
.fuente
continue
ybreak
.Envuelva eso en una función y luego simplemente
return
.fuente
Llego un poco tarde a la fiesta, pero el siguiente es un enfoque independiente del idioma que no utiliza GOTO / etiquetas o ajuste de funciones:
Por el lado positivo, fluye naturalmente, lo que debería complacer a la multitud que no es GOTO. En el lado negativo, el ciclo interno necesita completar la iteración actual antes de terminar, por lo que podría no ser aplicable en algunos escenarios.
fuente
break
ocontinue
inmediatamente después de establecer z e y? Me gusta la idea de usar lasfor
condiciones del bucle para comenzar. Elegante a su manera.Me doy cuenta de que este es un tema muy antiguo, pero como mi enfoque estándar aún no está aquí, pensé en publicarlo para los futuros googlers.
fuente
condition
evalúatrue
en la primera iteración del bucle anidado, aún ejecuta el resto de las 10 iteraciones, verificando elabort
valor cada vez. Este no es un problema de rendimiento para 10 iteraciones, pero sería con, digamos, 10,000.abort
y la expresión. En escenarios simples, eso podría estar bien, pero para bucles enormes con¿Como es que? :)
fuente
x
, si alguna lógica dentro del ciclo hace referencia a x en un momento posterior (por ejemplo, define una función anónima interna que se guarda y ejecuta más tarde), el valor de x será lo que sea estaba al final del ciclo, no el índice durante el cual se definió la función. (continuación)x
como parámetro a su función anónima para que cree una nueva copia de la misma, que luego puede ser referenciada como un cierre ya que no cambiará a partir de ese momento. En resumen, recomiendo la respuesta de ephemient.Bastante sencillo:
fuente
loop1=loop2=false;
Aquí hay cinco formas de salir de los bucles anidados en JavaScript:
1) Establecer el ciclo de los padres al final
2) Usar etiqueta
3) Usar variable
4) Utilice la función de ejecución automática
5) Use la función regular
fuente
break 2;
como la que tenemos en PHP. Sin etiquetas de bucle, sin funciones, sin verificaciones if-else, sin moderación con / voladura de variables de bucle, ¡simplemente sintaxis limpia!¿Qué tal si no se usan interrupciones, no hay marcas de cancelación y no se realizan comprobaciones adicionales de condición? Esta versión solo dispara las variables de bucle (las hace
Number.MAX_VALUE
) cuando se cumple la condición y obliga a todos los bucles a terminar con elegancia.Hubo una respuesta similar para los bucles anidados de tipo decreciente, pero esto funciona para bucles anidados de tipo incremental sin necesidad de considerar el valor de terminación de cada bucle para bucles simples.
Otro ejemplo:
fuente
¿Qué tal llevar los bucles a sus límites finales?
fuente
Si usa Coffeescript, existe una conveniente palabra clave "do" que facilita la definición y ejecución inmediata de una función anónima:
... así que simplemente puede usar "retorno" para salir de los bucles.
fuente
for
bucles, no dos.Pensé en mostrar un enfoque de programación funcional. Puede salir de las funciones anidadas Array.prototype.some () y / o Array.prototype.every (), como en mis soluciones. Un beneficio adicional de este enfoque es que
Object.keys()
enumera solo las propiedades enumerables de un objeto, mientras que "un bucle for-in enumera también las propiedades en la cadena del prototipo" .Cerca de la solución del OP:
Solución que reduce la iteración sobre los encabezados / elementos:
fuente
Ya mencionado anteriormente por swilliams , pero con un ejemplo a continuación (Javascript):
fuente
Hmmm hola a la fiesta de 10 años?
¿Por qué no poner alguna condición en tu para?
Así te detienes cuando quieres
En mi caso, usando Typecript, podemos usar algunos () que pasan por la matriz y se detienen cuando se cumple la condición. Entonces mi código se vuelve así:
De esta manera, el ciclo se detuvo justo después de que se cumpla la condición
Recordatorio: este código se ejecuta en TypeScript
fuente
fuente
la mejor manera es:
1) Ordenar los dos conjuntos que se usan en el primer y segundo bucle.
2) si el elemento coincide, rompa el bucle interno y mantenga el valor del índice.
3) cuando comience la próxima iteración, inicie el bucle interno con el valor de índice de retención.
fuente