En situaciones en las que necesita atravesar estructuras de datos anidadas de forma recursiva y ejecutar una operación para cada elemento, puede utilizar un combinación de recursividad y forEach. Sin embargo, puede haber casos en los que necesites salir prematuramente del bucle forEach.
A diferencia de un bucle normal con instrucciones break o continue, forEach carece de un mecanismo integrado para detener su iteración. Para simular este comportamiento, exploremos tres enfoques:
1. La forma "fea": usar un booleano contextual
Pase un segundo argumento a forEach como contexto y almacene un valor booleano en él. Dentro de la función de devolución de llamada, verifique el valor booleano y divídalo si es necesario. Este enfoque es visualmente poco atractivo.
function recurs(comment) {
var stop = false;
comment.comments.forEach(function (elem) {
recurs(elem);
if (...) stop = true;
}, stop);
}
2. La forma "controvertida": manejo de excepciones
Encierre el bucle forEach dentro de un bloque try-catch. Cuando quieras romper, lanza una excepción y atrápala fuera del bucle. Este enfoque puede afectar el rendimiento y generar dudas sobre la legibilidad del código.
try {
comment.comments.forEach(function (elem) {
recurs(elem);
if (...) throw new Error("Stop Iteration");
});
} catch (e) {
if (e.message === "Stop Iteration") return;
}
3. La forma "divertida": usar each()
every() es una mejor opción. Continúa iterando a través de la colección hasta que la función de devolución de llamada devuelve falso. Esto actúa efectivamente como una declaración de interrupción.
comment.comments.every(function (elem) {
recurs(elem);
if (...) return false;
return true;
});
También puedes usar some() en lugar de each() si prefieres devolver verdadero para romper.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3