Mai mult
Există o diferență între foreach și hartă?
Bine acest lucru este mai mult de un computer science întrebare, decât o întrebare bazată pe o anumită limbă, dar există o diferență între o hartă funcționarea și un foreach operație? Sau sunt pur și simplu nume diferite pentru același lucru?
213
9
Diferite.
foreach reiterează peste o listă și se aplică o operație cu efecte secundare pentru fiecare membru al listei (cum ar fi de economisire pentru baza de date de exemplu)
harta reiterează peste o listă, transformă fiecare membru din listă și întoarce o listă de aceeași dimensiune cu a transformat membri (cum ar fi conversia o listă de siruri de caractere în majuscule)
Diferența importantă dintre ele este că "harta" se acumulează toate rezultatele într-o colecție, întrucât "foreach" întoarce nimic. "harta" este de obicei folosit atunci când doriți să transforme o colecție de elemente cu o funcție, întrucât "foreach" pur și simplu execută o acțiune pentru fiecare element.
Pe scurt, "foreach" este pentru a aplica o operație pe fiecare element dintr-o colecție de elemente, întrucât "harta" este pentru transformând-o colecție în alta.
Există două diferențe semnificative între "foreach" și "harta".
"harta", pe de altă parte, are o restricție privind operațiunea: se așteaptă ca operațiunea să se întoarcă un element, și, probabil, accepta, de asemenea, un element la fel de argument. "Harta" operațiunea reiterează peste o colecție de elemente, aplicarea de funcționare pe fiecare element, și în cele din urmă stocarea rezultatul de fiecare invocare a funcționării într-o altă colecție. Cu alte cuvinte, "harta" transforms o colecție în alta.
"harta" funcționează cu două colecții de elemente: colecție de intrare și de ieșire de colectare.
Nu este o greșeală să se refere doi algoritmi: în fapt, puteți vizualiza cele două ierarhic, în cazul în care "harta" este o specializare de "foreach". Asta este, ai putea folosi "foreach" și au operațiunea transforma argumentul său și introduceți-l într-o altă colecție. Deci, "foreach" algoritm este o abstractizare, de generalizare, de "harta" algoritm. În fapt, pentru că "foreach" nu are nici o restricție privind funcționarea acestuia, putem spune cu siguranță că "foreach" este cel mai simplu mecanism de buclare acolo, și se poate face nimic o buclă poate face. "harta", precum și alte mai multe algoritmi de specialitate, este acolo pentru expresivitate: dacă doriți să hartă (sau de transformare) o colecție în alta, intenția este clară dacă utilizați "harta" decât dacă ai folosi "foreach".
Putem extinde această discuție în continuare, și ia în considerare "copie" algoritm: o buclă care clonele o colecție. Acest algoritm este o specializare de "foreach" algoritm. Ai putea defini o operație care, dat fiind un element, va introduce același element într-o altă colecție. Dacă utilizați "foreach" cu operația în vigoare a efectuat "copie" algoritm, deși redus cu claritate, expresivitate sau claritate. Las's ia-l chiar mai departe: putem spune că "harta" este o specializare de "copie", în sine, o specializare de "foreach". "harta" poate change oricare dintre elemente se reiterează peste. Dacă "harta" nu't a modifica oricare dintre elementele, atunci doar copied elemente, și folosind copy ar exprima intenția mai clar.
"Foreach" algoritmul în sine poate sau nu poate avea o valoare de retur, în funcție de limbă. În C++, de exemplu, "foreach" se întoarce operațiunea a primit inițial. Ideea este că operațiunea ar putea avea un stat, și poate doriți această operațiune înapoi pentru a inspecta cum a evoluat de-a lungul elementelor. "harta", de asemenea, poate sau nu poate returna o valoare. În C++ "transforma" (echivalentul pentru "harta" aici) se întâmplă pentru a întoarce un iterator la capătul de ieșire recipient (de colectare). În Ruby, valoarea returnată de "harta" este secvența de ieșire (de colectare). Deci, valoarea de returnare a algoritmilor este de fapt o punere în aplicare detaliu; efectul lor poate fi sau nu ce se vor întoarce.
Matrice.protototype.harta metoda &
Matrice.protototype.forEach` ambele sunt destul de similare.Executați următorul cod: http://labs.codecademy.com/bw1/6#:workspace
Ele dau exact idem rezultat.
Dar poftă de mâncare vine atunci când executați codul de mai jos:-
Aici am've pur și simplu atribuite rezultatul valoarea de returnare de pe hartă și forEach metode.
Acum, rezultatul este ceva complicat!
Concluzie
Matrice.prototip.harta
returnează o matrice darMatrice.prototip.forEach
nu't. Astfel încât să puteți manipula întors matrice în funcție de apel invers trecut la harta metodă și apoi se întoarce.`Matrice.prototip.forEach doar plimbări prin matrice dat astfel încât să puteți face lucruri în timp ce mersul pe jos matrice.
cele mai 'vizibil' diferența este că harta se acumulează rezultatul într-o nouă colecție, în timp ce foreach se face numai pentru executarea în sine.
dar există câteva ipoteze: de la 'scopul' de hartă este noua listă de valori, nu't contează ordinea de execuție. în fapt, unele executarea medii genera paralel cod, sau chiar să introducă unele memoizing pentru a evita apelarea repetată valori, sau lazyness, pentru a evita apelarea la toate.
foreach, pe de altă parte, este numit în mod special pentru efecte secundare; prin urmare, ordinea este importantă, și, de obicei,'t fi paralela.
Răspuns scurt: "harta" și "forEach" sunt diferite. De asemenea, neoficial vorbind, "harta" este strict superset de "forEach".
Timp de răspuns: în Primul rând, să's-a venit cu o linie de descrieri ale "forEach" și "harta":
În multe limbi, "forEach" este adesea numit doar pentru fiecare`. Următoarea discuție utilizează JavaScript doar pentru referință. Ar putea fi orice altă limbă.
Acum, las's a folosi fiecare dintre aceste funcții.
Folosind "forEach":
Sarcina 1: Scrie o funcție
printSquares
, care acceptă o serie de numerearr
, și imprimă pătrat a fiecărui element în ea.Soluție 1:
Folosind "harta":
Sarcina 2: Scrie o funcție
selfDot
, care acceptă o serie de numerearr
, și returnează o matrice în care fiecare element este pătrat de elementul corespunzător înarr
.Deoparte: Aici, în termeni de argou, suntem încercarea de a pătrat matrice de intrare. Pus în mod oficial, suntem încercarea de a calcula's dot produs cu sine.
Solutia 2:
Cum este "harta" un superset de "forEach"?
Puteți utiliza "harta" pentru a rezolva ambele sarcini, Sarcina 1 și Sarcina 2. Cu toate acestea, nu puteți utiliza "forEach" pentru a rezolva Sarcina 2.
În Soluție 1, dacă puteți înlocui pur și simplu "forEach" de "harta", soluția va fi în continuare valabile. În Soluție 2 cu toate acestea, înlocuirea "harta" de "forEach" va rupe anterior soluție de lucru.
De punere în aplicare "forEach" în termeni de "harta":
Un alt mod de a realiza "harta" 's superioritatea este de a pune în aplicare "forEach" în termeni de "harta". Ca suntem programatori buni, ne-am'll câștigat't răsfățați-vă în nume de poluare. Am'll call nostru "forEach", doar pentru fiecare`.
Acum, dacă nu't ca "prototip" prostii, aici te duci:
Deci, umm.. de Ce's nu "forEach" chiar exista?
Răspunsul este eficiența. Dacă nu sunteți interesat în transformarea unei matrice într-o altă matrice, de ce ar trebui să vă calcula transformat matrice? Numai să-l arunce? Desigur că nu! Dacă tu nu't vrei o transformare, nu ar trebui't face o transformare.
Deci, în timp ce harta poate fi folosit pentru a rezolva Sarcina 1, probabil că ar trebui't. Pentru fiecare este candidatul potrivit pentru asta.
Original răspuns:
În timp ce eu, în mare măsură, de acord cu @madlep 's a răspunde, am'd dori să subliniez faptul că harta lui()
e o **stricte super-set** de
forEach()`.Da, map()` este de obicei folosit pentru a crea o nouă matrice. Cu toate acestea, ea poate de asemenea fi folosit pentru a schimba actuala serie.
Aici's un exemplu:
În exemplul de mai sus, " a " a fost amplasat convenabil, astfel că
un[i] === am
pentrui < un.lungime
. Chiar și așa, o demonstrează puterea de hartă()`.Aici's descrierea oficială de hartă()`. Rețineți că harta lui()
se poate schimba chiar și matrice pe care este chemat! Ave
map()`.Sper că acest lucru m-a ajutat.
Editat de 10-Nov-2015: Adăugat elaborarea.
Aici este un exemplu în Scala folosind liste: harta returnează lista, foreach întoarce nimic.
Deci harta întoarce lista rezultată în urma aplicării funcției f pentru fiecare element de listă:
Foreach se aplică doar f pentru fiecare element:
Daca're vorbesc despre Javascript în special, diferența este că "harta" este o funcție buclă în timp ce "forEach" este un iterator.
Utilizați "harta" atunci când doriți să se aplice o operațiune pentru fiecare membru al listei și a obține rezultatele înapoi și o nouă listă, fără a afecta lista inițială.
Utilizarea "forEach" atunci când vrei să faci ceva pe baza de fiecare element al listei. S-ar putea fi adăugarea de lucruri la pagina, de exemplu. În esență, l's mare pentru atunci când vrei "efecte secundare".
Alte diferențe: "forEach" returnează nimic (deoarece este într-adevăr un control funcție de debit), și a trecut-în funcție primește referințe la index și întreaga listă, întrucât harta revine noua listă și doar trece în elementul curent.
ForEach încearcă să aplice o funcție, cum ar fi scris db etc pe fiecare element al RDD fără a se întoarce nimic înapoi.
Dar harta lui()` se aplică o funcție asupra elementelor de discontinuitate a regresiei și returnează rdd. Deci, atunci când tu a alerga mai jos metoda nu va't eșua la line3 dar în timp ce colectarea rdd după aplicarea foreach va eșua și de a arunca o eroare care spune