[1,2,3].forEach(function(el) {
if(el === 1) break;
});
¿Cómo puedo hacer esto usando el nuevo forEach
método en JavaScript? Lo he intentado return;
, return false;
y break
. break
se bloquea y return
no hace nada más que continuar la iteración.
javascript
arrays
Scott Klarenbach
fuente
fuente
return
continúa la iteración, omitirá cualquier código que venga después en el bloque. Tome este código, por ejemplo:[1,2,3].forEach(function(el) { if(el === 2) { console.log(`Match on 2!`); return; } console.log(el); });
.Laconsole.log(el);
se saltará cuando se empareja 2.Respuestas:
No hay incorporado en capacidad de
break
enforEach
. Para interrumpir la ejecución, tendría que lanzar una excepción de algún tipo. p.ej.Las excepciones de JavaScript no son terriblemente bonitas. Un
for
bucle tradicional podría ser más apropiado si realmente lo necesitabreak
.Utilizar
Array#some
En cambio, use
Array#some
:Esto funciona porque
some
regresatrue
tan pronto como cualquiera de las devoluciones de llamada, ejecutadas en orden de matriz, regresatrue
, cortocircuitando la ejecución del resto.some
, es inversoevery
(que se detendrá en areturn false
), yforEach
son todos los métodos ECMAScript Fifth Edition que deberán agregarse a losArray.prototype
navegadores en los que faltan.fuente
some
yevery
, esto debería estar en TOP en la respuesta. No puedo entender por qué la gente piensa que es menos legible. ¡Es simplemente increíble!Array#some
es realmente agradable. En primer lugar, es compatible con la mayoría de los navegadores, incluidos ie9 y firefox 1.5, también funciona muy bien. Mi ejemplo de uso será encontrar el índice en una matriz de rangos [a, b] donde un número está entre un límite inferior y un par de límite superior, probar y devolver verdadero cuando se encuentra.for..of
sería la siguiente mejor solución, aunque solo para navegadores más nuevos.Ahora hay una forma aún mejor de hacer esto en ECMAScript2015 (también conocido como ES6) usando el nuevo bucle for . Por ejemplo, este código no imprime los elementos de la matriz después del número 5:
De los documentos:
¿Necesita el índice en la iteración? Puedes usar
Array.entries()
:fuente
entries
. for (const [index, element] of someArray.entries ()) {// ...}Object.entries(myObject)
y luego usarlo exactamente como lo usafor..in
para la matriz. Tenga en cuenta que las matrices JS son básicamente objetos bajo el capó: blog.niftysnippets.org/2011/01/myth-of-arrays.htmlPuedes usar todos los métodos:
ES6
para usar el antiguo soporte de navegador:
Más detalles aquí .
fuente
[1,2,3].every( el => el !== 1 )
every
garantiza que las llamadas se realicen en secuencia?k
comienza en 0 y se incrementa en 1: http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.everyCitando de la documentación de MDN de
Array.prototype.forEach()
:Para su código (en la pregunta), como lo sugiere @bobince, use
Array.prototype.some()
en su lugar. Se adapta muy bien a su caso de uso.fuente
Desafortunadamente en este caso será mucho mejor si no lo usas
forEach
. En su lugar, use unfor
bucle regular y ahora funcionará exactamente como es de esperar.fuente
Considere utilizar
jquery
eleach
método de, ya que permite devolver falso dentro de la función de devolución de llamada:Las bibliotecas de Lodash también proporcionan un
takeWhile
método que se puede encadenar con map / reduce / fold, etc.fuente
De su ejemplo de código, parece que
Array.prototype.find
es lo que está buscando: Array.prototype.find () y Array.prototype.findIndex ()fuente
Si desea utilizar la sugerencia de Dean Edward y lanzar el error StopIteration para salir del ciclo sin tener que atrapar el error, puede usar la siguiente función ( originalmente desde aquí ):
El código anterior le dará la capacidad de ejecutar código como el siguiente sin tener que hacer sus propias cláusulas try-catch:
Una cosa importante para recordar es que esto solo actualizará la función Array.prototype.forEach si ya existe. Si aún no existe, no lo modificará.
fuente
Respuesta corta: use
for...break
esto o cambie su código para evitar romperloforEach
. No utilizar.some()
ni.every()
para emularfor...break
. Reescribe tu código para evitar elfor...break
bucle, o úsalofor...break
. Cada vez que usas estos métodos comofor...break
alternativa, Dios mata al gatito.Respuesta larga:
.some()
y.every()
ambos devuelven elboolean
valor,.some()
devuelvetrue
si hay algún elemento para el que devuelve la función pasadatrue
, cada devuelvefalse
si hay algún elemento para el que devuelve la función pasadafalse
. Esto es lo que significan las funciones. Usar funciones para lo que no significan es mucho peor que usar tablas para el diseño en lugar de CSS, porque frustra a todos los que leen su código.Además, la única forma posible de utilizar estos métodos como
for...break
alternativa es hacer efectos secundarios (cambiar algunos valores fuera de la.some()
función de devolución de llamada), y esto no es muy diferentefor...break
.Por lo tanto, usar
.some()
o.every()
comofor...break
alternativa de bucle no está libre de efectos secundarios, esto no es mucho más limpiofor...break
, es frustrante, por lo que no es mejor.Siempre puede volver a escribir su código para que no sea necesario
for...break
. Puede filtrar la matriz usando.filter()
, puede dividir la matriz usando.slice()
y así sucesivamente, luego usar.forEach()
o.map()
para esa parte de la matriz.fuente
for...break
loop si necesita rendimiento.for
bucle es la herramienta más performant iteración que.forEach()
,.any()
,.map()
,.filter()
etc.Esto es algo que se me ocurrió para resolver el problema ... Estoy bastante seguro de que soluciona el problema que tenía el autor de la pregunta original:
Y luego lo llamarías usando:
Devolver falso dentro de la función de devolución de llamada provocará un descanso. Avísame si eso realmente no funciona.
fuente
=== false
podría ser mejor que== false
no tener que devolver explícitamente verdadero (o un valor verdadero) para continuar el ciclo, no sea que alguna ruta de control no devuelva un valor y el ciclo se rompa inesperadamente.Otro concepto que se me ocurrió:
fuente
Array.prototype.forEach()
.for
ybreak
existía mucho antes de que se hiciera esta pregunta; el OP estaba buscando ese comportamiento usando, el más funcionalforEach
,.for...in
ybreak
.fuente
Encontré esta solución en otro sitio. Puede ajustar forEach en un escenario de prueba / captura.
Más detalles aquí: http://dean.edwards.name/weblog/2006/07/enum/
fuente
Si no necesita acceder a su matriz después de la iteración, puede rescatarla estableciendo la longitud de la matriz en 0. Si aún la necesita después de su iteración, podría clonarla usando un corte.
O con un clon:
Lo cual es una solución mucho mejor que arrojar errores aleatorios en su código.
fuente
array.length
a0
que se aplicará en la iteración actual, por lo que, probablemente, a veces es mejor usarreturn
después de dicha asignaciónEste es un bucle for, pero mantiene la referencia del objeto en el bucle como un forEach () pero puede salir.
fuente
Como se mencionó anteriormente, no puedes romper
.forEach()
.Aquí hay una forma un poco más moderna de hacer un foreach con los iteradores ES6. Le permite obtener acceso directo a
index
/value
al iterar.Salida:
Enlaces
Array.prototype.entries()
fuente
Otro enfoque
fuente
Utilizo nullhack para ese propósito, intenta acceder a la propiedad de
null
, que es un error:fuente
throw BREAK
?Si desea mantener su
forEach
sintaxis, esta es una manera de mantenerla eficiente (aunque no tan buena como un ciclo regular). Verifique de inmediato si hay una variable que sepa si desea salir del ciclo.Este ejemplo utiliza una función anónima para crear un ámbito de función alrededor del
forEach
cual necesita almacenar la información realizada .Mis dos centavos.
fuente
Sé que no es lo correcto. No es romper el ciclo. Es un jugad
fuente
Use la
array.prototype.every
función, que le proporciona la utilidad para romper el bucle. Vea el ejemplo aquí Documentación de Javascript en la red de desarrolladores de Mozillafuente
De acuerdo con @bobince, upvoted.
Además, para su información:
Prototype.js tiene algo para este propósito:
$break
será capturado y manejado por Prototype.js internamente, rompiendo el ciclo "cada" pero sin generar errores externos.Ver Prototype.JS API para más detalles.
jQuery también tiene una forma, solo devuelve false en el controlador para romper el ciclo temprano:
Ver jQuery API para más detalles.
fuente
Este no es el más eficiente, ya que todavía se ciclan todos los elementos, pero pensé que valdría la pena considerar lo más simple:
fuente
continue
es una palabra clave, su código es un error de sintaxis.for of
bucle y,break;
como de costumbre, de eso.puedes seguir el siguiente código que funciona para mí:
fuente
Prefiero usar
for in
for in
funciona de manera similarforEach
, y puede agregar la función de retorno a la salida dentro. Mejor rendimiento también.fuente
Si necesita dividir en función del valor de los elementos que ya están en su matriz como en su caso (es decir, si la condición de ruptura no depende de la variable de tiempo de ejecución que puede cambiar después de que se asignen los valores de los elementos a la matriz), también puede usar la combinación de slice () e indexOf () de la siguiente manera.
Si necesita romper cuando forEach llega a 'Apple', puede usar
Como se indica en W3Schools.com el método slice () devuelve los elementos seleccionados en una matriz, como un nuevo objeto de matriz. La matriz original no se cambiará.
Véalo en JSFiddle
Espero que ayude a alguien.
fuente
Se puede crear una variante de
forEach
que permitebreak
,continue
,return
, e inclusoasync
/await
: (ejemplo escrito a máquina)Uso:
fuente
intente con "buscar":
fuente
Sí, es posible continuar y salir de un bucle forEach.
Para continuar, puede usar return, el ciclo continuará pero la función actual finalizará.
Para salir del bucle, puede establecer el tercer parámetro a 0 de longitud, establecer en una matriz vacía. El bucle no continuará, la función actual sí, por lo que puede usar "volver" para terminar, como salir en un bucle normal para ...
Esta:
imprimirá esto:
fuente
Antes, mi código está debajo
He cambiado a continuación, se solucionó.
fuente