recentemente tive uma entrevista de codificação que envolveu a avaliação de um esquema contra outro. Os detalhes não são assim tão importantes, mas uma coisa que saiu dela (no meio da entrevista) foi que você não pode sair de um loop forEach()
. Tinha-me esquecido daquela pequena porcaria e provavelmente lixou as minhas hipóteses de ser contratada. Depois de ler isto, espero que não cometa o mesmo erro que eu! Não sejas como eu.
se você preferir assistir do que ler, confira a versão de vídeo disto!
MDN conhece tudo
conforme observado pela MDN:
não há nenhuma maneira de parar ou quebrar um laço forEach() que não seja lançando uma exceção. Se você precisar de tal comportamento, o método forEach() é a ferramenta errada
que é alguma grosseira hardcore vindo dos docs MDN. No entanto, têm razão, saber qual a ferramenta a escolher é importante.
Antes de nos aprofundarmos demasiado no motivo pelo qual você não pode fugir de um forEach()
, vamos examinar o que é um loop e de onde veio forEach()
.
o que é um Loop
um loop na programação resolve um problema bastante comum: Preciso de comparar o mesmo código com todos estes dados. Simplificando, é:
repetir o mesmo código vezes sem conta (on loop) até chegarmos a um estado final definido.
o problema
para fins de comparação, vamos resolver o mesmo problema usando os vários tipos de loop. Aqui está o problema:
Compare duas matrizes e veja se os itens nelas são os mesmos.
Aqui estão os dados que vamos comparar:
const jedis = const sith =
temos duas matrizes, ambas com alguns nomes. Provavelmente vais reparar que o Anakin é um Jedi e um Sith. Este é um exemplo trivial, no entanto não muito longe do que eu fui testado durante a minha entrevista.
a velha maneira
o que eu não quero que você obtenha deste artigo é que um laço é melhor do que outro. Todos eles oferecem soluções de programação únicas e têm um local para casos específicos de uso. O truque é saber qual usar quando.
tradicional para Loop
se você já tomou qualquer tipo de curso de programação, você provavelmente foi exposto ao nosso bom amigo o loop for
. Tem sido uma ferramenta útil para programadores por um longo tempo e ainda é útil hoje. Vamos resolver o nosso problema usando-o.
// Our data again, for referenceconst jedis = ;const sith = ;// start our loop, define our iterator variablefor (let i = 0; i < jedis.length; i++) { // create a variable we can reference const thisJedi = jedis; // see if the item in the array we are testing exists if (sith.includes(thisJedi)) { // If it does exist, then that jedi is also a sith console.log(`${thisJedi} is also a Sith`); // we can exit out break; } console.log(`${thisJedi} is not a Sith`);}
o loop for oferece uma maneira muito útil de sair do nosso código se ele atender a uma condição que escolhemos. Isto é imensamente útil ao fazer loop sobre uma tonelada de dados. Foi muito útil para resolver alguns dos problemas do projecto Euler, especificamente este.
a Nova outra maneira
entre outras coisas, forEach()
foi carimbada na especificação em 2009, juntamente com toda a outra bondade que nos foi dada na ES5. Ele serve como um método útil para escrever código limpo que facilmente itera sobre itens em um array.
o que está a fazer?
a forEach()
loop é uma função que executa outra função (callback) em cada item em um array. Nós definimos o que acontece nessa função de callback. JS é bom o suficiente para nos dar três parâmetros nessa função:
- o item na matriz
- o índice do item
- a matriz inteira
vamos dar uma olhada no nosso problema usando um laço forEach()
. Incluí os três parâmetros na função, mas só estamos a usar o primeiro, o item, que vou nomear jedi
// We have to create a global state variable to keep track of what is happening let matching // loop over array jedis.forEach((jedi,index,array) => { // check to see if jedi is in sith if(!sith.includes(jedi)) { // if it isn't, set global variable to false matching = false } // it keeps going... }) console.log(matching) // false
se faz mais sentido, você pode refacturar a função callback em uma função nomeada. Acho que o torna um pouco mais legível. Também nos permite reutilizar esta função onde quisermos. Programação funcional!
let matching function isJediAlsoSith(jedi,index,array) { if(!sith.includes(jedi)) { matching = false } } jedis.forEach(isJediAlsoSith)
a nossa solução faz essencialmente a mesma coisa. A única diferença é que ele continua funcionando até chegar ao final do array jedis
. Para um conjunto de tamanho tão pequeno, duvido que faça grande diferença de desempenho.Mas Porquê?Isto finalmente nos leva à resposta à nossa pergunta, por que não podemos sair de um laço forEach()
? É porque o loop está executando essa função de callback sobre cada item, então mesmo se você escrever um return
ele só está retornando nessa instância da função. Continua. No caso da função forEach()
, ela não faz nada com o código retornado. Esteja ciente, este não é o caso para alguns dos outros métodos da matriz.
adicionalmente, por causa disto, break
ou continue
não são declarações válidas.
outras formas
existem alguns tipos diferentes de loops. Todos eles têm objectivos diferentes e eu recomendaria que investigassem cada um deles. Nem sempre é preciso um laço forEach()
.
forEach () vs map ()
provavelmente, os métodos de matriz mais comuns que aparecem em tutoriais são forEach()
e map()
. A maior diferença entre os dois é que map
irá retornar um novo Array, enquanto um forEach()
não irá.
Loops tradicionais
while loop
Array Methods
Array.forEach ()
Array.Mapa ()
Array.Filtro ()
Array.reduzir()
Array.Reduceright()
Array.todos()
Array.alguns ()
Array.indexOf ()
Array.lastIndexOf ()
Array.find ()
Array.findIndex()
Iterable Objeto de Loops (incluindo Arrays)
no
para
Esta é a Forma
Como mencionado anteriormente extremamente audacioso MDN docs, escolhendo a ferramenta certa é fundamental para o sucesso. O número de opções pode parecer um pouco esmagador no início, mas eu gosto de tomar a abordagem de: “se funcionar, é a ferramenta certa.”
de um modo geral, você pode rebater seu código até a morte, mas então você está apenas perdendo tempo você pode estar construindo coisas. No caso da minha entrevista, estava a usar a ferramenta certa, da maneira errada. Se me tivesse lembrado que não se pode fugir de um laço de forEach, as coisas provavelmente teriam sido diferentes🤷 🏼 ♂ ️.
se tiver alguma partilha de Informação adicional, por favor largue-a nos comentários abaixo!
como sempre, codificação feliz.
Plugs
estou escrevendo um livro sobre design Gráfico e como ele se relaciona com o desenvolvimento de software! Se estiver interessado, Inscreva-se aqui para actualizações.
https://digitalnutt.substack.com/p/coming-soon?r=34slo&utm_campaign=post&utm_medium=web&utm_source=copy
Música
também escrevo música! Olha para isto.: Spotify / Youtube / Apple Music
suporte
se você gosta deste artigo e quer ver mais, a melhor maneira de fazer isso é subscrever/seguir-me aqui! Se você está se sentindo gracioso, você pode me pagar um café!