recorrer for es6 array javascript ecmascript-5

es6 - javascript foreach break



¿Cómo detener Javascript forEach? (13)

Esta pregunta ya tiene una respuesta aquí:

Estoy jugando con nodejs y mongoose, tratando de encontrar comentarios específicos en comentarios profundos que se anidan con función recursiva y foreach in. ¿Hay una manera de detener nodejs forEach? Como entiendo, cada iteración forEach es una función y no puedo simplemente hacer "break", solo "return" pero esto no detendrá a foreach.

function recurs(comment){ comment.comments.forEach(function(elem){ recurs(elem); //if(...) break; }); }


¿Wy no usa el simple retorno?

function recurs(comment){ comment.comments.forEach(function(elem){ recurs(elem); if(...) return; });

volverá de la función ''recurs''. Lo uso así. Aunque esto no se romperá de forEach sino de toda la función, en este sencillo ejemplo podría funcionar


Como han señalado otros, no puede cancelar un bucle forEach , pero aquí está mi solución:

ary.forEach(function loop(){ if(loop.stop){ return; } if(condition){ loop.stop = true; } });

Por supuesto, esto no rompe realmente el bucle, solo evita la ejecución de código en todos los elementos después de la "ruptura"


En algunos casos, Array.some probablemente cumplirá los requisitos.


No puedes romper con un forEach . Aunque puedo pensar en tres maneras de fingirlo.

1. The Ugly Way : pase un segundo argumento a forEach para usarlo como contexto , y almacene un booleano allí, luego use un if . Esto se ve horrible.

2. La manera polémica : rodee todo en un bloque try-catch y lance una excepción cuando quiera romper. Esto se ve bastante mal y puede afectar el rendimiento , pero puede ser encapsulado.

3. La forma divertida : utilizar every() .

[''a'', ''b'', ''c''].every(function(element, index) { // Do your thing, then: if (you_want_to_break) return false else return true })

Puede usar some() lugar, si prefiere return true para romper.


Puede interrumpir un ciclo forEach si sobrescribe el método Array:

(function(){ window.broken = false; Array.prototype.forEach = function(cb, thisArg) { var newCb = new Function("with({_break: function(){window.broken = true;}}){("+cb.replace(/break/g, "_break()")+"(arguments[0], arguments[1], arguments[2]));}"); this.some(function(item, index, array){ newCb(item, index, array); return window.broken; }, thisArg); window.broken = false; } }())

ejemplo:

[1,2,3].forEach("function(x){/ if (x == 2) break;/ console.log(x)/ }")

Desafortunadamente, con esta solución no puede usar la interrupción normal dentro de sus devoluciones de llamada, debe ajustar el código no válido en cadenas y las funciones nativas no funcionan directamente (pero puede solucionarlo)

Feliz rompiendo


Puede usar la función ForEach de forEach si no le importa usar bibliotecas de terceros.

Ejemplo:

var _ = require(''lodash''); _.forEach(comments, function (comment) { do_something_with(comment); if (...) { return false; // Exits the loop. } })


Salir de la Array#forEach no es posible. (Para confirmar esto, puede inspeccionar el código fuente que lo implementa en Firefox en la página vinculada).

En su lugar, debe utilizar un bucle normal for :

function recurs(comment) { for (var i = 0; i < comment.comments.length; ++i) { var subComment = comment.comments[i]; recurs(subComment); if (...) { break; } } }

(o, si quieres ser un poco más inteligente al respecto y comment.comments[i] siempre es un objeto :)

function recurs(comment) { for (var i = 0, subComment; subComment = comment.comments[i]; ++i) { recurs(subComment); if (...) { break; } } }


Supongo que quieres usar Array.prototype. find Buscar se dividirá cuando encuentre su valor específico en la matriz.

var inventory = [ {name: ''apples'', quantity: 2}, {name: ''bananas'', quantity: 0}, {name: ''cherries'', quantity: 5} ]; function findCherries(fruit) { return fruit.name === ''cherries''; } console.log(inventory.find(findCherries)); // { name: ''cherries'', quantity: 5 }


forEach no se rompe en el retorno, hay soluciones feas para conseguir este trabajo, pero sugiero no usarlo, en su lugar, intente usar Array.prototype.some o Array.prototype.every

var f = "how to stop Javascript forEach?".split('' ''); f.forEach(function (a,b){ console.info(b+1); if (a == ''stop'') { console.warn("/tposition: /'stop/'["+(b+1)+"] /r/n/tall length: " + (f.length)); f.length = 0; //<--!!! } });


jQuery proporciona un método each() , no forEach() . Puedes salir de each devolviendo false . forEach() es parte del estándar ECMA-262, y la única manera de salir de eso que conozco es lanzando una excepción.

function recurs(comment) { try { comment.comments.forEach(function(elem) { recurs(elem); if (...) throw "done"; }); } catch (e) { if (e != "done") throw e; } }

Feo, pero hace el trabajo.


Array.forEach no puede romperse y usar los métodos try...catch o hacky como Array.every o Array.some . Array.some solo harán que su código sea más difícil de entender. Solo hay dos soluciones para este problema:

1) use un antiguo bucle for : esta será la solución más compatible, pero puede ser muy difícil de leer cuando se usa a menudo en grandes bloques de código:

var testArray = [''a'', ''b'', ''c'']; for (let [key, value] of testArray.entries()) { console.log(key); // This is the key; console.log(value); // This is the value; }

2) utilice el nuevo ECMA6 (especificación 2015) en los casos en que la compatibilidad no sea un problema. Tenga en cuenta que incluso en 2016, solo algunos navegadores e IDE ofrecen un buen soporte para esta nueva especificación. Si bien esto funciona para objetos iterables (por ejemplo, Arrays), si desea usar esto en objetos no iterables, deberá usar el método Object.entries . Este método apenas está disponible a partir del 18 de junio de 2016 e incluso Chrome requiere una chrome://flags/#enable-javascript-harmony especial para habilitarlo: chrome://flags/#enable-javascript-harmony . Para Arrays, no necesitará todo esto, pero la compatibilidad sigue siendo un problema:

var ar = [1,2,3,4,5]; ar.some(function(item,index){ if(item == 3){ return true; } console.log("item is :"+item+" index is : "+index); });

3) Mucha gente estaría de acuerdo en que ni la primera ni la segunda opción son buenos candidatos. Hasta que la opción 2 se convierta en el nuevo estándar, las bibliotecas más populares como AngularJS y jQuery ofrecen sus propios métodos de bucle que pueden ser superiores a cualquier cosa disponible en JavaScript. También para aquellos que aún no están usando estas grandes bibliotecas y que están buscando opciones ligeras, se pueden usar soluciones como github.com/nbouvrette/forEach y casi estarán a la par con ECMA6 mientras se mantiene la compatibilidad con navegadores más antiguos.


El siguiente código romperá el bucle foreach una vez que se cumpla la condición, a continuación se muestra el ejemplo.

var array = [1,2,3,4,5]; var newArray = array.slice(0,array.length); array.forEach(function(item,index){ //your breaking condition goes here example checking for value 2 if(item == 2){ array.length = array.indexOf(item); } }) array = newArray;


var testArray = [''a'', ''b'', ''c'']; for (var key = 0; key < testArray.length; key++) { var value = testArray[key]; console.log(key); // This is the key; console.log(value); // This is the value; }