Hvorfor kan du't bryte en forEach loop / ByteSize JS

jeg har nylig hatt et kodingsintervju som involverte å evaluere ett skjema mot en annen. Detaljene i det er ikke så viktige, men en ting som kom ut av det (midt i intervjuet) var at du ikke kan bryte ut av en forEach() loop. Jeg hadde glemt den lille godbit, og det sannsynligvis skrudd opp mine sjanser til å bli ansatt. Når du leser dette, håper jeg du ikke gjør den samme feilen som jeg gjorde! Ikke vær som meg.

https://media.giphy.com/media/nRkQduJDZ43bW/giphy.gif

hvis du foretrekker å se enn å lese, sjekk ut videoversjonen av dette!

MDN Kjenner Alle

som nevnt AV MDN:

Det er ingen måte å stoppe eller bryte en forEach() loop annet enn ved å kaste et unntak. Hvis du trenger slik oppførsel, er foreach () – metoden feil verktøy

det er noe hardcore sass som kommer fra MDN-dokumentene. Men de har rett, å vite hvilket verktøy å velge er viktig.

Før vi kommer for dypt inn i hvorfor du ikke kan bryte ut av en forEach() ,la oss undersøke hva en sløyfe selv er og hvor forEach() kom fra.

Hva er En Sløyfe

en sløyfe i programmering løser et ganske vanlig problem: Jeg må kjøre den samme koden mot alle disse dataene. Enkelt sagt, det er:

Gjenta den samme koden om og om igjen (på loop) til vi når en definert slutttilstand.

Problemet

for sammenligningens skyld skal vi løse det samme problemet ved hjelp av de forskjellige sløyfetypene. Her er problemet:

Sammenlign to arrays og se om elementene i dem er de samme.

her er dataene vi skal sammenligne:

 const jedis = const sith = 

Vi har to arrays, begge med et par navn. Du vil sannsynligvis legge merke Til At Anakin er Både En Jedi og En Sith. Dette er et trivielt eksempel, men ikke langt unna det jeg ble testet på under intervjuet mitt.

Den Gamle Måten

Det jeg ikke vil at du skal få fra denne artikkelen er at en sløyfe er bedre enn en annen. De tilbyr alle unike programmeringsløsninger og har et sted for spesifikke brukstilfeller. Trikset er å vite hvilken du skal bruke når.

Tradisjonell For Loop

hvis du noen gang har tatt noen form for programmeringskurs, har du sannsynligvis blitt utsatt for vår gode venn for loop. Det har vært et nyttig verktøy for programmerere i lang tid og er fortsatt nyttig i dag. La oss løse vårt problem ved å bruke det.

// 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`);}

for loop tilbyr en ganske praktisk måte å avslutte koden vår hvis den oppfyller en tilstand vi velger. Dette er utrolig nyttig når looping OVER MASSEVIS av data. Det har vært svært nyttig i å løse Noen Av Prosjekt Euler problemer, spesielt denne.

Den Nye Another Way

blant annet forEach() ble stemplet i spec i 2009 sammen med all den andre godheten som ble gitt OSS I ES5. Det fungerer som en praktisk metode for å skrive ren kode som enkelt iterates over elementer i en matrise.

Hva gjør det?

en forEach() loop er en funksjon som kjører en annen funksjon (tilbakeringing) på hvert element i en matrise. Vi definerer hva som skjer i den tilbakeringingsfunksjonen. JS er hyggelig nok til å gi oss tre parametere i den funksjonen:

  1. elementet i arrayet
  2. indeksen for elementet
  3. hele arrayet

La oss ta en titt på vårt problem ved å bruke en forEach() sløyfe i stedet. Jeg har tatt med alle tre parametrene i funksjonen, men vi bruker bare den første, elementet, som jeg navngir 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

Hvis det er mer fornuftig, kan du refactor tilbakeringingsfunksjonen til en navngitt funksjon. Jeg tror det gjør det litt mer lesbart. Det tillater oss også å gjenbruke denne funksjonen hvor vi vil. Yay funksjonell programmering!

 let matching function isJediAlsoSith(jedi,index,array) { if(!sith.includes(jedi)) { matching = false } } jedis.forEach(isJediAlsoSith)

vår løsning gjør i hovedsak det samme. Den eneste forskjellen er at den fortsetter å løpe til den når slutten av jedis – arrayet. For en rekke av en så liten størrelse tviler jeg på at det vil gjøre mye av en ytelsesforskjell.

Men Hvorfor?

dette bringer oss endelig til svaret på vårt spørsmål, hvorfor kan vi ikke bryte ut av en forEach() loop? Det er fordi sløyfen kjører den tilbakeringingsfunksjonen over hvert element, så selv om du skriver en return, kommer den bare tilbake på den forekomsten av funksjonen. Det fortsetter å gå. Når det gjelder forEach() – funksjonen, gjør den ikke noe med den returnerte koden. Vær oppmerksom på at det ikke er tilfelle for noen av De andre Array-Metodene.

I Tillegg, på grunn av dette, break eller continue er ikke gyldige setninger.

Andre Måter

det er ganske mange forskjellige typer løkker. De har alle forskjellige formål, og jeg vil anbefale å se på hver enkelt. Du trenger ikke alltid en forEach() loop .

https://media.giphy.com/media/tnwuVMx6n1VtK/giphy.gif

forEach () vs map()

Sannsynligvis er de vanligste arraymetodene som vises i opplæringsprogrammer forEach() og map() . Den største forskjellen mellom de to er at map vil returnere en ny Matrise, mens en forEach() ikke vil.

Tradisjonelle Løkker

mens sløyfe

Matrisemetoder

Matrise.forEach ()

Matrise.kart ()

Matrise.filter()

Matrise.reduser ()

Matrise.reduksjon ()

Matrise.hver ()

Matrise.noen ()

Matrise.indexOf ()

Matrise.lastIndexOf ()

Matrise.finn()

Matrise.findIndex()

Iterable Objektsløyfer (inkludert Arrays)

for i

for av

Dette Er Måten

Baby Yoda

som nevnt tidligere av de utrolig sassy MDN docs, velger du riktig verktøy paramount til suksess. Antall alternativer kan virke litt overveldende i begynnelsen, men jeg liker å ta tilnærmingen til: «hvis det virker, er det riktig verktøy.»

Generelt sett kan du refactor koden din til døden, men da kaster du bare bort tid du kan bygge ting. I tilfelle av intervjuet mitt brukte jeg riktig verktøy, feil måte. Hadde jeg visst husket at du ikke kan bryte ut av en forEach-løkke, ville det nok ha vist seg forskjellige🤷 🏼 ♂ ️.

hvis du har ytterligere info, vennligst slipp det i kommentarene nedenfor!

som alltid, glad koding.

Plugger

jeg skriver en bok om grafisk design og hvordan det relaterer seg til programvareutvikling! Hvis du er interessert, registrer deg her for oppdateringer.

https://digitalnutt.substack.com/p/coming-soon?r=34slo&utm_campaign=post&utm_medium=web&utm_source=copy

Musikk

jeg skriver også musikk! Sjekk det ut her: Spotify / Youtube / Apple Music

Support

hvis du liker denne artikkelen Og vil se mer, er den beste måten å gjøre det på å abonnere/følg meg på her! Hvis du føler deg nådig, kan du kjøpe meg en kaffe!



+