De ce puteți't rupe o buclă forEach | ByteSize JS

am avut recent un interviu de codificare care a implicat evaluarea unei scheme împotriva alteia. Detaliile nu sunt atât de importante, dar un lucru care a ieșit din ea (în mijlocul interviului) a fost că nu poți ieși dintr-o buclă forEach(). Am uitat că tidbit puțin și, probabil, dat peste cap șansele mele de a obține angajat. După ce ați citit acest lucru, sperăm că nu veți face aceeași greșeală pe care am făcut-o! Nu fi ca mine.

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

dacă preferați să vizionați decât să citiți, consultați versiunea video a acestui lucru!

MDN știe toate

după cum sa menționat de MDN:

nu există nici o modalitate de a opri sau rupe un forEach() buclă, altele decât prin aruncarea o excepție. Dacă aveți nevoie de un astfel de comportament, metoda forEach() este instrumentul greșit

asta e ceva Sass hardcore provenind din Docs MDN. Cu toate acestea, au dreptate, știind ce instrument să aleagă este important.

înainte de a intra prea adânc în motivul pentru care nu puteți ieși dintr-un forEach(), să examinăm ce este chiar o buclă și de unde a venit forEach().

ce este o buclă

o buclă în programare rezolvă o problemă destul de comună: Am nevoie pentru a rula același cod împotriva tuturor acestor date. Pur și simplu, este:

repetarea aceluiași cod de mai multe ori (pe buclă) până când ajungem la o stare finală definită.

problema

de dragul comparației, vom rezolva aceeași problemă folosind diferitele tipuri de buclă. Iată problema:

comparați două matrice și vedeți dacă elementele din ele sunt aceleași.

Iată datele pe care le vom compara:

 const jedis = const sith = 

avem două tablouri, ambele cu câteva nume. Probabil veți observa că Anakin este atât un Jedi, cât și un Sith. Acesta este un exemplu banal, însă nu departe de ceea ce am fost testat în timpul interviului meu.

vechiul mod

ceea ce nu vreau să obțineți din acest articol este că o buclă este mai bună decât alta. Toate oferă soluții unice de programare și au un loc pentru cazuri specifice de utilizare. Trucul este să știi pe care să-l folosești când.

tradițional pentru buclă

dacă ați luat vreodată vreun tip de curs de programare, probabil că ați fost expus bunului nostru prieten bucla for. A fost un instrument la îndemână pentru programatori de mult timp și este util și astăzi. Să ne rezolvăm problema folosind-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`);}

bucla for oferă o modalitate destul de utilă de a ieși din Codul nostru dacă îndeplinește o condiție pe care o alegem. Acest lucru este extrem de util atunci când looping peste o tona de date. A fost foarte util în rezolvarea unora dintre problemele proiectului Euler, în special aceasta.

noul alt mod

printre altele, forEach() a fost ștampilat în spec în 2009 împreună cu toate celelalte bunătăți care ne-au fost date în ES5. Acesta servește ca o metodă la îndemână pentru a scrie cod curat, care iterează cu ușurință peste elemente într-o matrice.

ce face?

o buclă forEach() este o funcție care rulează o altă funcție (apel invers) pe fiecare element dintr-o matrice. Definim ce se întâmplă în acea funcție de apel invers. JS este destul de frumos pentru a ne oferi trei parametri în această funcție:

  1. elementul din matrice
  2. indexul elementului
  3. întreaga matrice

să aruncăm o privire la problema noastră folosind o buclă forEach() în schimb. Am inclus toți cei trei parametri în funcție, dar folosim doar primul, elementul, pe care îl numesc 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

dacă are mai mult sens, puteți refactor funcția de apel invers într-o funcție numită. Cred că o face un pic mai ușor de citit. De asemenea, ne permite să reutilizăm această funcție oriunde dorim. Yay Programare funcțională!

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

soluția noastră face în esență același lucru. Singura diferență este că continuă să funcționeze până când ajunge la sfârșitul matricei jedis. Pentru o serie de dimensiuni atât de mici, mă îndoiesc că va face o mare diferență de performanță.

Dar De Ce?

acest lucru ne aduce în cele din urmă la răspunsul la întrebarea noastră, de ce nu putem ieși dintr-o buclă forEach()? Se datorează faptului că bucla rulează acea funcție de apel invers peste fiecare element, deci chiar dacă scrieți un return se întoarce doar pe acea instanță a funcției. Continuă să meargă. În cazul funcției forEach(), nu face nimic cu codul returnat. Fiți conștienți, că nu este cazul pentru unele dintre celelalte metode matrice.

în plus, din această cauză, break sau continue nu sunt declarații valide.

alte moduri

există destul de multe tipuri diferite de bucle. Toate au scopuri diferite și aș recomanda căutarea în fiecare dintre ele. Nu aveți întotdeauna nevoie de o buclă forEach().

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

forEach () vs map ()

probabil, cele mai comune metode de matrice care apar în tutoriale sunt forEach() și map() . Cea mai mare diferență dintre cele două este că map va returna o nouă matrice, în timp ce un forEach() nu.

bucle tradiționale

în timp ce bucla

metode matrice

matrice.forEach ()

matrice.hartă ()

matrice.filtru ()

matrice.reduce ()

matrice.reductor dreapta ()

matrice.fiecare ()

matrice.unele ()

matrice.indexOf ()

matrice.lastIndexOf ()

matrice.găsi ()

matrice.Findindex()

bucle obiect Iterabile (inclusiv matrice)

pentru în

pentru de

acesta este modul

Baby Yoda

așa cum am menționat mai devreme de Docs MDN incredibil de sassy, alegerea instrumentului potrivit este extrem de important pentru succes. Numărul de opțiuni poate părea un pic copleșitor la început, dar îmi place să abordez: „dacă funcționează, este instrumentul potrivit.”

în general, puteți refactor codul la moarte, dar atunci esti doar pierdem timpul ai putea fi construirea lucruri. În cazul interviului meu, am folosit instrumentul potrivit, în mod greșit. Dacă mi-aș fi amintit că nu poți ieși dintr-o buclă forEach, lucrurile probabil s-ar fi dovedit diferite.

dacă aveți orice cota de informații suplimentare, vă rugăm să-l picătură în comentariile de mai jos!

ca întotdeauna, codificare fericit.

Prize

scriu o carte despre design grafic și cum se referă la dezvoltarea de software! Dacă sunteți interesat, înscrieți-vă aici pentru actualizări.

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

Muzică

de asemenea, scriu muzică! Verificați-l aici: Spotify / Youtube / Apple Music

suport

dacă vă place acest articol și doriți să vedeți mai multe, cel mai bun mod de a face acest lucru este să vă abonați/urmați-mă aici! Dacă te simți grațios, poți să-mi cumperi o cafea!



+