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?

Comentarii la întrebare (1)
Soluția

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)

Comentarii (4)

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.

Comentarii (2)

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".

  1. "foreach" nu are restricții conceptuale privind funcționarea acesta se aplică, altele decât poate accepta un element la fel de argument. Asta este, operațiunea poate face nimic, poate avea un efect secundar, poate returna o valoare sau nu poate returna o valoare. Toate "foreach" îi pasă este de a itera peste o colecție de elemente, și se aplică operația pe fiecare element.

"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.

  1. "foreach" funcționează cu o singură colecție de elemente. Aceasta este o colecție de intrare.

"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.

Comentarii (1)

Matrice.protototype.harta metoda &Matrice.protototype.forEach` ambele sunt destul de similare.

Executați următorul cod: http://labs.codecademy.com/bw1/6#:workspace

var arr = [1, 2, 3, 4, 5];

arr.map(function(val, ind, arr){
    console.log("arr[" + ind + "]: " + Math.pow(val,2));
});

console.log();

arr.forEach(function(val, ind, arr){
    console.log("arr[" + ind + "]: " + Math.pow(val,2));
});

Ele dau exact idem rezultat.

arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25

arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25

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.

var arr = [1, 2, 3, 4, 5];

var ar1 = arr.map(function(val, ind, arr){
    console.log("arr[" + ind + "]: " + Math.pow(val,2));
    return val;
});

console.log();
console.log(ar1);
console.log();

var ar2 = arr.forEach(function(val, ind, arr){
    console.log("arr[" + ind + "]: " + Math.pow(val,2));
    return val;
});

console.log();
console.log(ar2);
console.log();

Acum, rezultatul este ceva complicat!

arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25

[ 1, 2, 3, 4, 5 ]

arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25

undefined

Concluzie

Matrice.prototip.harta returnează o matrice dar Matrice.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.

Comentarii (0)

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.

Comentarii (0)

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":

  • "forEach" reiterează peste toate elementele, de asteptare furnizate de funcția pe fiecare.
  • "harta" reiterează peste toate elementele, de asteptare furnizate de funcția pe fiecare, și produce un transformate matrice amintindu-ne rezultatul de fiecare apel de funcție.

Î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 numere arr, și imprimă pătrat a fiecărui element în ea.

Soluție 1:

var printSquares = function (arr) {
    arr.forEach(function (n) {
        console.log(n * n);
    });
};

Folosind "harta":

Sarcina 2: Scrie o funcție selfDot, care acceptă o serie de numere arr, și returnează o matrice în care fiecare element este pătrat de elementul corespunzător în arr.

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:

var selfDot = function (arr) {
    return arr.map(function (n) {
        return n * n;
    });
};

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`.

Array.prototype.each = function (func) {
    this.map(func);
};

Acum, dacă nu't ca "prototip" prostii, aici te duci:

var each = function (arr, func) {
    arr.map(func); // Or map(arr, func);
};

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** deforEach()`.

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:

var a = [0, 1, 2, 3, 4], b = null;
b = a.map(function (x) { a[x] = 'What!!'; return x*x; });
console.log(b); // logs [0, 1, 4, 9, 16] 
console.log(a); // logs ["What!!", "What!!", "What!!", "What!!", "What!!"]

În exemplul de mai sus, " a " a fost amplasat convenabil, astfel că un[i] === am pentru i < 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! Avemap()`.

Sper că acest lucru m-a ajutat.


Editat de 10-Nov-2015: Adăugat elaborarea.

Comentarii (2)

Aici este un exemplu în Scala folosind liste: harta returnează lista, foreach întoarce nimic.

def map(f: Int ⇒ Int): List[Int]
def foreach(f: Int ⇒ Unit): Unit

Deci harta întoarce lista rezultată în urma aplicării funcției f pentru fiecare element de listă:

scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)

scala> list map (x => x * 2)
res0: List[Int] = List(2, 4, 6)

Foreach se aplică doar f pentru fiecare element:

scala> var sum = 0
sum: Int = 0

scala> list foreach (sum += _)

scala> sum
res2: Int = 6 // res1 is empty
Comentarii (0)

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.

Comentarii (0)

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

Dosar "<stdin>", linia 5, în <modulul>

AttributeError: 'NoneType' obiect nu are atributul 'colecta'

nums = sc.parallelize([1,2,3,4,5,6,7,8,9,10])
num2 = nums.map(lambda x: x+2)
print ("num2",num2.collect())
num3 = nums.foreach(lambda x : x*x)
print ("num3",num3.collect())
Comentarii (0)