Em situações em que você precisa percorrer estruturas de dados aninhadas recursivamente e executar uma operação para cada elemento, você pode usar um combinação de recursão e forEach. No entanto, pode haver casos em que você precise sair prematuramente do loop forEach.
Ao contrário de um loop regular com instruções break ou continue, forEach não possui um mecanismo integrado para interromper sua iteração. Para simular esse comportamento, vamos explorar três abordagens:
1. A maneira "feia": usando um booleano contextual
Passe um segundo argumento para forEach como o contexto e armazene um valor booleano nele. Dentro da função de retorno de chamada, verifique o booleano e interrompa se necessário. Essa abordagem é visualmente desagradável.
function recurs(comment) {
var stop = false;
comment.comments.forEach(function (elem) {
recurs(elem);
if (...) stop = true;
}, stop);
}
2. A maneira "controversa": tratamento de exceções
Coloque o loop forEach dentro de um bloco try-catch. Quando você quiser interromper, lance uma exceção e capture-a fora do loop. Essa abordagem pode afetar o desempenho e levantar preocupações sobre a legibilidade do 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. A maneira "divertida": usar every()
every() é uma opção melhor. Ele continua iterando pela coleção até que a função de retorno de chamada retorne falso. Isso efetivamente atua como uma instrução de interrupção.
comment.comments.every(function (elem) {
recurs(elem);
if (...) return false;
return true;
});
Você também pode usar some() em vez de every() se preferir retornar true para break.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3