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.
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:
- az elem a tömbben
- az elem indexe
- 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.
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
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!