Qual è la differenza tra .map, .every e .forEach?


118

Mi sono sempre chiesto quale fosse la differenza tra loro. Sembrano tutti fare la stessa cosa ...


6
Qualcuno ha aggiunto un tag jQuery ... considerando everye forEachnon sono metodi jQuery, penso che sia improbabile che la domanda si riferisca a jQuery in alcun modo. developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6
James Allardice

Penso che questo link dovrebbe avere la risposta che stai cercando.
zBomb

Ho ragione nel pensare che ti riferisci ai nuovi metodi di array specifici di Mozilla come dettagliato nel collegamento nel mio commento precedente?
James Allardice

@James - Questi non sono specifici di Mozilla . Condividerei anche un link al webkit e ai documenti di opera, ma non so dove sono fuori dalla mia testa.
gilly3

@ gilly3 - Ahh, buon punto. Credo che siano supportati solo in IE9, non di seguito.
James Allardice

Risposte:


224

La differenza è nei valori di ritorno.

.map() restituisce un nuovo array di oggetti creati eseguendo un'azione sull'elemento originale.

.every() restituisce un valore booleano - vero se ogni elemento in questo array soddisfa la funzione di test fornita. Una differenza importante .every()è che la funzione di test potrebbe non essere sempre chiamata per ogni elemento dell'array. Una volta che la funzione di test restituisce false per qualsiasi elemento, non vengono più iterati gli elementi dell'array. Pertanto, la funzione di test di solito non dovrebbe avere effetti collaterali .

.forEach() non restituisce nulla : itera l'Array eseguendo una determinata azione per ogni elemento nell'Array.

Leggi questi e molti altri metodi di iterazione di Array su MDN .


In alternativa, si potrebbe citare l' MDN
JoshWillik,

3
@ josh - Ho citato MDN. Ogni nome di metodo è collegato alla relativa documentazione in MDN.
gilly3

@ gilly3, mi scuso, ho sorvolato sul testo blu>.>
JoshWillik

.forEach () restituisce niente è sbagliato ora, forse non era nel 2012 ma nel 2015 almeno in Chrome, prova questo arr2 = ['sue', 'joe', 'ben', 'guy', 'tom', 'jon ']; b = arr2.forEach (function (el, indx) {console.log (indx + ':' + el);}); console.log (b);
jason

1
@EugeneMercer Per "elemento originale" intendo il valore originale di ogni elemento dell'array.
gilly3

88

La risposta di gilly3 è fantastica. Volevo solo aggiungere un po 'di informazioni su altri tipi di funzioni di "ciclo tra elementi".

  • .every() (interrompe il ciclo la prima volta che l'iteratore restituisce falso o qualcosa di falso)
  • .some() (interrompe il ciclo la prima volta che l'iteratore restituisce vero o qualcosa di vero)
  • .filter() (crea un nuovo array includendo elementi in cui la funzione di filtro restituisce true e omettendo quelli in cui restituisce false)
  • .map() (crea un nuovo array dai valori restituiti dalla funzione iteratore)
  • .reduce() (costruisce un valore chiamando ripetutamente l'iteratore, passando i valori precedenti; vedere le specifiche per i dettagli; utile per sommare il contenuto di un array e molte altre cose)
  • .reduceRight() (come reduce, ma funziona in ordine decrescente anziché ascendente)

credito a: TJCrowder For-each su un array in JavaScript?


Ottieni 100 Mi piace da me!
Shamim

6

Un'altra considerazione per le grandi risposte di cui sopra è il concatenamento. Con forEach () non puoi concatenare, ma con map (), puoi.

Per esempio:

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

arrayNumbers.map(function(i) {
    return i * 2
}).sort();

con .forEach (), non puoi fare .sort (), riceverai un errore.


0

Per Ramda , la differenza tra R.map()e R.forEach()è:

  1. R.forEach()restituisce l'array originale mentre R.map()restituisce un funtore
  2. R.forEach()può operare solo su un array ma R.map()può anche operare su un oggetto (cioè le coppie chiave / valore dell'oggetto sono trattate come un array)

La domanda è correlata al linguaggio Javascript. Ramda, sebbene fantastico, è un argomento completamente diverso e una libreria.
SeaWarrior404
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.