Mai mult
Scurt-circuit Matrice.forEach cum ar fi de asteptare rupe
[1,2,3].forEach(function(el) {
if(el === 1) break;
});
Cum pot face acest lucru folosind noul "forEach" metoda în JavaScript? Am'am încercat revenirea lui;,
return false; "" și "pauză". "rupe" de accidente și "întoarcere" nu face nimic, dar continua repetare.
1416
29
Nu's built-in capacitatea de a "sparge" în "forEach". Pentru a întrerupe executarea ar trebui să arunca o excepție de un anumit fel. de exemplu.
JavaScript excepții sunt't teribil de frumos. Un tradițional "pentru" bucla ar putea fi mai potrivit, dacă aveți cu adevărat nevoie de a "rupe" în interiorul acestuia.
Utilizare
Matrice#unele
În schimb, utilizați
Matrice#unele
:Acest lucru funcționează pentru că "unele" returnează "adevărat" de indata ce oricare dintre callback, executată în array comanda, returnează "adevărat", scurt-circuit executarea de restul.
"unele", își inverse
fiecare
(care se va opri pe oreturn false
), și "forEach" sunt toate ECMAScript de-a Cincea Ediție a metodelor care vor trebui să fie adăugate la `Matrice.prototip pe browsere de unde au're lipsește.Există acum o modalitate mai bună de a face acest lucru în ECMAScript2015 (aka ES6) folosind noua pentru a buclei. De exemplu, acest cod nu imprimați elementele de matrice după numărul 5:
Din documente:
Trebuie indicelui în repetare? Puteți utiliza
Matrice.intrări()
:Puteți utiliza fiecare metoda:
ES6
pentru vechi sprijin browser-ul folosit:
mai multe detalii aici.
Citez din MDN documentația de
Array.prototype.forEach()
:Pentru cod (în cauză), după cum a sugerat @bobince, utilizare
Array.prototype.some()
în loc. Se potriveste foarte bine la usecase.Din păcate, în acest caz, acesta va fi mult mai bine dacă tu nu't folosi "forEach". În loc să folosească un "pentru" buclă și va funcționa exact așa cum v-ați aștepta.
Ia în considerare pentru a utiliza "jquery" 's
fiecare
metoda, deoarece permite să se întoarcă false în interiorul funcție de apel invers:Lodash biblioteci oferă, de asemenea,
takeWhile
metoda care poate fi legat cu map/reduce/ori etc:Din exemplu de cod, se pare ca `Matrice.prototip.găsi ceea ce căutați pentru: Matrice.prototip.find() și Matrice.prototip.findIndex()
Dacă doriți să utilizați Dean Edward's sugestie si arunca StopIteration eroare pentru a iesi din bucla fără a fi nevoie pentru a prinde de eroare, puteți folosi următoarea funcție (inițial de aici):
Codul de mai sus va oferi posibilitatea de a rula cod, cum ar fi următoarele, fără a fi nevoie să-ți faci propriul try-catch clauze:
Un lucru important de reținut este faptul că acest lucru va actualiza numai Matrice.prototip.forEach funcție, dacă acesta există deja. Dacă nu't există deja, acesta nu va modifica-l.
Răspuns scurt: utilizați pentru...rupe
pentru acest lucru sau să modificați codul pentru a evita ruperea de "forEach". A nu se folosi
.unele (de) "sau".fiecare()să se întreacă pentru...rupe
. Rescrie codul pentru a evitapentru...rupe
bucla, sau de a folosi pentru...rupe. De fiecare dată când utilizați aceste metode ca pentru...rupe
alternative Dumnezeu ucide pisica.Răspuns lung:
.unele () "și".fiecare()
reveniboolean
valoare.unele()
returnează "true" dacă există orice element pentru care au trecut funcția returnează "adevărat", fiecare se întoarce "fals" dacă nu există nici un element care a trecut funcția returnează "false". Aceasta este ceea ce că funcțiile. Utilizarea funcțiilor pentru ceea ce ei nu't să spun este mult mai rău atunci folosind tabele pentru layout în loc de CSS, pentru că-l enervează pe toată lumea care citește codul.De asemenea, singurul mod posibil de a utiliza aceste metode pentru...rupe
alternativă este de a face efecte secundare (schimba unele vars în afara
.unele()callback function), iar acest lucru nu este cu mult diferit de la
pentru...rupe`.Deci, folosind
.unele (de) "sau".fiecare () " ca " pentru...rupe
bucla alternativă e't lipsite de efecte secundare, e't mult mai curat atunci pentru...rupe`, acest lucru este frustrant, așa că nu e't mai bine.Întotdeauna poți rescrie codul dvs., astfel încât nu va mai fi nevoie în
pentru...rupe
. Puteți filtra matrice folosind.filtru()
, puteți împărți matrice folosind.slice()
și așa mai departe, apoi utilizați.forEach () "sau".harta()
pentru că o parte din matrice.A găsit această soluție pe un alt site. Puteți încheia forEach într-un try / catch scenariu.
Mai multe detalii aici: http://dean.edwards.name/weblog/2006/07/enum/
Acest lucru este doar ceva cu care am venit pentru a rezolva problema... m-am'm destul de sigur că rezolvă problema că originalul asker avut:
Un alt concept am venit cu:
Dacă tu nu't nevoie pentru a accesa matrice după repetare puteți salva prin stabilirea matrice's lungimea la 0. Dacă încă nevoie de ea după repetare ai putea clona folosind felie..
Sau cu o clona:
Care este o soluție mult mai bine apoi a aruncat aleatoare erori în cod.
Aceasta este o buclă, dar menține obiectul de referință în buclă ca un forEach (), dar puteți ieși.
Așa cum am menționat înainte, puteți't rupe
.forEach()
.Aici's un pic mai modern mod de a face un foreach cu ES6 Iteratori. Vă permite să obțineți acces direct la "index" / "valoare" atunci când iterarea.
Ieșire:
Link-uri
Array.prototype.entries()
Eu folosesc nullhack pentru acest scop, ea încearcă să acceseze proprietatea
null
, care este o eroare:Știu că nu-i corect mod. Nu se rupe bucla. Este un Jugad
Dacă vrei să-ți păstrezi "forEach" sintaxa, aceasta este o modalitate de a păstra eficient (deși nu la fel de bun ca un regulat pentru bucla). Verificați imediat pentru o variabilă care știe că, dacă vrei să ieși din bucla.
Acest exemplu utilizează o funcție anonim pentru a crea o funcție de domeniul de aplicare în jur de "forEach" care aveți nevoie pentru a stoca făcut informații.
Cei doi cenți ai mei.
O altă abordare
Folosi `matrice.prototip.fiecare funcția, care vă oferă utilitatea de a sparge looping. Vezi de exemplu aici Javascript documentația pe Mozilla developer network