Miért lehet't megszakítani egy forEach hurkot / ByteSize JS

nemrég volt egy kódolási interjúm, amely magában foglalta az egyik séma értékelését a másik ellen. A részletek nem annyira fontosak, de egy dolog, ami kijött belőle (az interjú közepén) az volt, hogy nem lehet kitörni egy forEach() hurokból. Elfelejtettem azt a kis apróságot, és valószínűleg elszúrta az esélyeimet, hogy felvegyenek. Miután elolvasta ezt, remélhetőleg, nem fogja elkövetni ugyanazt a hibát, mint én! Ne légy olyan, mint én.

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

ha inkább nézni, mint olvasni, nézd meg ennek a videó verzióját!

az MDN mindent tud

amint azt az MDN megjegyezte:

a forEach() hurok megállítására vagy megszakítására nincs mód, kivéve egy kivétel dobását. Ha ilyen viselkedésre van szüksége, a forEach() módszer a rossz eszköz

ez néhány kemény sass az MDN dokumentumokból. Igazuk van azonban, fontos tudni, hogy melyik eszközt kell választani.

mielőtt túl mélyen belemerülnénk abba, hogy miért nem lehet kitörni egy forEach() – ból, vizsgáljuk meg, mi a páros hurok, és honnan származik forEach().

mi az a hurok

a programozási hurok meglehetősen gyakori problémát old meg: Ugyanazt a kódot kell lefuttatnom az összes adaton. Egyszerűen fogalmazva, ez:

ugyanazt a kódot ismételjük újra és újra (hurokban), amíg el nem érünk egy meghatározott végállapotot.

a probléma

az összehasonlítás kedvéért ugyanazt a problémát fogjuk megoldani a különböző huroktípusok segítségével. Itt van a probléma:

hasonlítson össze két tömböt, és nézze meg, hogy a benne lévő elemek azonosak-e.

itt vannak az adatok, amelyeket összehasonlítani fogunk:

 const jedis = const sith = 

két tömbünk van, mindkettőnek van pár neve. Valószínűleg észre fogod venni, hogy Anakin egyszerre Jedi és Sith. Ez egy triviális példa, azonban nem messze attól, amit az interjú során teszteltem.

a régi út

amit nem akarok, hogy ebből a cikkből kapj, az az, hogy az egyik hurok jobb, mint a másik. Mindegyik egyedi programozási megoldásokat kínál, és helyet biztosít a konkrét felhasználási esetekhez. A trükk az, hogy tudjuk, melyiket mikor használjuk.

hagyományos hurok

ha valaha is részt vett bármilyen programozási tanfolyamon, akkor valószínűleg ki volt téve jó barátunknak, a for huroknak. A programozók számára már régóta hasznos eszköz, és ma is hasznos. Oldjuk meg a problémánkat ezzel.

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

A for hurok elég praktikus módot kínál a kódunkból való kilépéshez, ha megfelel egy általunk választott feltételnek. Ez rendkívül hasznos, ha egy csomó adatot hurkolunk. Nagyon hasznos volt a Project Euler néhány problémájának megoldásában, különösen ez.

A New Another Way

többek között a forEach() 2009-ben került a specifikációba, az összes többi jósággal együtt, amelyet az ES5-ben kaptunk. Praktikus módszerként szolgál tiszta kód írására, amely könnyen iterál egy tömb elemein.

mit csinál?

a forEach() hurok egy olyan függvény, amely egy tömb minden elemén egy másik függvényt (visszahívást) futtat. Meghatározzuk, mi történik abban a visszahívási funkcióban. A JS elég szép ahhoz, hogy három paramétert adjon nekünk ebben a függvényben:

  1. az elem a tömbben
  2. az elem indexe
  3. az egész tömb

vessünk egy pillantást a problémánkra egy forEach() hurok helyett. Mindhárom paramétert belefoglaltam a függvénybe, de csak az elsőt használjuk, az elemet, amelyet megnevezek 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

ha több értelme van, akkor refactor a visszahívási funkció egy megnevezett függvény. Azt hiszem, ez egy kicsit olvashatóbbá teszi. Ez lehetővé teszi számunkra, hogy ezt a funkciót bárhol újra felhasználjuk. Hurrá funkcionális programozás!

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

a mi megoldásunk lényegében ugyanezt teszi. Az egyetlen különbség az, hogy addig fut, amíg el nem éri a jedis tömb végét. Egy ilyen kis méretű tömb esetében kétlem, hogy ez nagy teljesítménybeli különbséget jelent.

De Miért?

ez végül elvezet minket a kérdésre adott válaszhoz, miért nem tudunk kitörni egy forEach() hurokból? Ez azért van, mert a hurok minden elemen futtatja ezt a visszahívási funkciót, így még akkor is, ha return – ot írsz, csak a függvény azon példányán tér vissza. Ez megy tovább. A forEach() függvény esetében nem csinál semmit a visszaküldött kóddal. Ne feledje, hogy a többi tömb módszer esetében nem ez a helyzet.

továbbá, emiatt, break vagy continue nem érvényes állítások.

egyéb módok

nagyon sok különböző típusú hurok létezik. Mindegyiknek más a célja, és azt javaslom, hogy vizsgálja meg mindegyiket. Nem mindig kell forEach() hurok.

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

forEach () vs map ()

valószínű, hogy az oktatóanyagokban megjelenő leggyakoribb tömb módszerek a forEach() és map(). A legnagyobb különbség a kettő között az, hogy map új tömböt ad vissza, míg a forEach() nem.

hagyományos hurkok

míg hurok

tömb módszerek

tömb.forEach ()

tömb.térkép()

tömb.szűrő()

tömb.reduce()

tömb.reduceRight ()

tömb.minden ()

tömb.néhány ()

tömb.indexOf ()

tömb.lastIndexOf ()

tömb.find()

tömb.findIndex()

Iterable Object Loops (beleértve a tömbök)

a

a

ez az út

Baby Yoda

amint azt korábban a hihetetlenül pimasz MDN docs, a megfelelő eszköz kiválasztása ez a legfontosabb a sikerhez. A lehetőségek száma eleinte kissé elsöprőnek tűnhet, de szeretem a megközelítést: “ha működik, akkor ez a megfelelő eszköz.”

Általánosságban elmondható, hogy a kódot halálra lehet refaktorálni, de akkor csak az időt pazarolja, hogy dolgokat építsen. Az interjúm esetében a megfelelő eszközt használtam, rossz módon. Ha tudtam volna, hogy nem tudsz kitörni egy forEach hurokból, akkor a dolgok valószínűleg másképp alakultak volna.

ha bármilyen további információ megosztása, kérjük, dobja el az alábbi megjegyzéseket!

mint mindig, boldog kódolás.

dugók

könyvet írok a grafikai tervezésről és arról, hogyan kapcsolódik a szoftverfejlesztéshez! Ha érdekel, iratkozzon fel ide a frissítésekért.

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

Zene

zenét is írok! Nézd meg itt: Spotify / Youtube / Apple Zene

támogatás

Ha tetszik ez a cikk, és többet szeretne látni, a legjobb módja annak, hogy feliratkozzon/kövessen itt! Ha kedvesnek érzi magát, meghívhat egy kávéra!



+