JavaScript: differenza tra .forEach () e .map ()


116

So che c'erano molti argomenti come questo. E conosco le basi: .forEach()opera sull'array originale e .map()su quello nuovo.

Nel mio caso:

function practice (i){
    return i+1;
};

var a = [ -1, 0, 1, 2, 3, 4, 5 ];
var b = [ 0 ];
var c = [ 0 ];
console.log(a);
b = a.forEach(practice);
console.log("=====");
console.log(a);
console.log(b);
c = a.map(practice);
console.log("=====");
console.log(a);
console.log(c);

E questo è l'output:

[ -1, 0, 1, 2, 3, 4, 5 ]
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
undefined
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
[ 0, 1, 2, 3, 4, 5, 6 ]

Non riesco a capire perché l'utilizzo di practicemodifiche al valore di ba undefined.
Mi dispiace se questa è una domanda stupida, ma sono abbastanza nuovo in questa lingua e le risposte che ho trovato finora non mi hanno soddisfatto.


49
È così semplice: .map restituisce un nuovo array , mentre .forEach non restituisce nulla . Fondamentalmente, se vuoi ottenere una forma modificata dell'array precedente, usi .map, se non lo vuoi, usi .forEach.
user4642212


@Xufox - Ho rosso questo argomento prima di crearne uno nuovo, ma la risposta non mi ha soddisfatto.
DzikiChrzan

Non dire solo che non ti soddisfa. In che modo esattamente non risponde alla tua domanda (hai letto tutte le risposte?)? Qual è la tua domanda specifica che non è coperta dal target duplicato proposto?
user4642212

@Xufox Questa domanda riguarda le funzioni autoimplementate e non riguarda le funzioni ES5 standardizzate.
colpisci il

Risposte:


146

Non sono la stessa cosa. Lasciami spiegare la differenza.

forEach: Esegue l'iterazione su un elenco e applica alcune operazioni con effetti collaterali a ciascun membro dell'elenco (esempio: salvataggio di ogni elemento dell'elenco nel database)

map: Esegue un'iterazione su un elenco, trasforma ogni membro di tale elenco e restituisce un altro elenco della stessa dimensione con i membri trasformati (esempio: trasformazione di un elenco di stringhe in maiuscolo)

Riferimenti

Array.prototype.forEach () - JavaScript | MDN

Array.prototype.map () - JavaScript | MDN


5
E come ha detto Xufox - .forEach non restituisce nulla, questo è il caso. Grazie per l'aiuto! Segnerò questa risposta tra 10 minuti.
DzikiChrzan

1
elenco restituito mappe e forEach no. OK
Ashad Nasim

62
  • Array.forEach "Esegue una funzione fornita una volta per elemento dell'array."

  • Array.map "Crea un nuovo array con i risultati della chiamata di una funzione fornita su ogni elemento di questo array."

Quindi, in forEachrealtà non restituisce nulla. Chiama semplicemente la funzione per ogni elemento dell'array e poi è fatto. Quindi qualunque cosa tu ritorni all'interno di quella funzione chiamata viene semplicemente scartata.

D'altra parte, mapchiamerà in modo simile la funzione per ogni elemento dell'array, ma invece di scartare il suo valore di ritorno, lo catturerà e costruirà un nuovo array di quei valori di ritorno.

Questo significa anche che si può usare mapovunque si sta utilizzando forEach, ma ancora non dovrebbe fare che così non si raccolgono i valori di ritorno, senza alcuno scopo. È solo più efficiente non raccoglierli se non ne hai bisogno.


Da notare: nel 2015, sarebbe stato discutibile che forEachsarebbe stato "più efficiente" rispetto mapsoprattutto se fosse richiesto un polyfill per supportare forEachsu un browser più vecchio (IE8 o 9). Non è necessario assegnare la restituzione di mapa nulla; il valore restituito dovrebbe essere raccolto in Garbage Collector immediatamente dopo i mapresi quando il ritorno di mapnon è assegnato.
cowbert

3
@cowbert Solo perché qualcosa viene immediatamente raccolto nella spazzatura, ciò non significa che non sarai colpito dalle allocazioni necessarie. Quindi concettualmenteforEach sarà ancora più efficiente e più adatto per attività in cui non è necessario raccogliere risultati. E non so voi, ma nel 2015 non stavo più sviluppando per IE8 (che tra l'altro non supportava nemmeno ); e supporto per IE9 + . E in realtà un mese dopo la mia risposta, Microsoft ha interrotto il supporto per quei browser. mapforEach
colpisci

Sia forEach che map sono garantiti per elaborare gli elementi nello stesso ordine?
Quentin 2

1
@ Quentin2 Sì, inoltre, entrambe le funzioni sono sincrone, quindi mape le forEachchiamate torneranno solo una volta che l'intero array è stato eseguito in loop e il callback è stato chiamato per ciascuna.
colpisci il

25
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| | foreach | mappa |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Funzionalità | Esegue una determinata operazione su ogni | Esegue la "trasformazione" data su |
| | elemento dell'array | "copia" di ogni elemento |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Valore restituito | Restituisce undefined | Restituisce un nuovo array con |
| | | elementi che lasciano l'array originale |
| | | invariato |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Preferibile | Esecuzione della non trasformazione come | Ottenere un array contenente l'output di |
| scenario di utilizzo | elaborazione su ogni elemento. | alcune elaborazioni eseguite su ogni elemento |
| ed esempio | | dell'array. |
| | Ad esempio, salvando tutti gli elementi in | |
| | il database | Ad esempio, ottenere un array di |
| | | lunghezze di ogni stringa nel |
| | | matrice |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +

Si prega di modificare il tuo post e mostrare il testo vero e proprio, invece di immagini. Gli altri non possono copiare e incollare dalla tua immagine, eseguire ricerche all'interno della tua immagine o contribuire a migliorare il contenuto del testo nell'immagine. Vedi qui per i dettagli. Grazie.
Pang

2
Questo può aiutarti a disegnare tabelle artistiche ASCII: webapps.stackexchange.com/q/6700/126269
Pang


7

forEach: se vuoi eseguire un'azione sugli elementi di un Array ed è la stessa che usi per il ciclo. Il risultato di questo metodo non ci fornisce un output che acquista solo un ciclo tra gli elementi.

map: se vuoi eseguire un'azione sugli elementi di un array e vuoi anche memorizzare l'output della tua azione in un array. Questo è simile al ciclo for all'interno di una funzione che restituisce il risultato dopo ogni iterazione.

Spero che questo ti aiuti.


5

La differenza sta in quello che restituiscono. Dopo l'esecuzione:

arr.map()

restituisce un array di elementi risultanti dalla funzione elaborata; mentre:

arr.forEach()

restituisce undefined.


5

L'analisi delle prestazioni per i cicli è più veloce di map o foreach all'aumentare del numero di elementi in un array.

let array = [];
for (var i = 0; i < 20000000; i++) {
  array.push(i)
}

console.time('map');
array.map(num => {
  return num * 4;
});
console.timeEnd('map');


console.time('forEach');
array.forEach((num, index) => {
  return array[index] = num * 4;
});
console.timeEnd('forEach');

console.time('for');
for (i = 0; i < array.length; i++) {
  array[i] = array[i] * 2;

}
console.timeEnd('for');

Ecco il risultato sul mio computer:map: 1642ms forEach: 885ms for: 748ms
Flavio Vilante


1

Una cosa da sottolineare è che foreach salta i valori non inizializzati mentre map no.

var arr = [1, , 3];

arr.forEach(function(element) {
    console.log(element);
});
//Expected output: 1 3

console.log(arr.map(element => element));
//Expected output: [1, undefined, 3];

0

Differenza tra forEach () e map ()

forEach () si limita a scorrere gli elementi. Elimina i valori di ritorno e restituisce sempre undefined.Il risultato di questo metodo non fornisce un output.

map () il ciclo attraverso gli elementi alloca memoria e memorizza i valori di ritorno iterando l'array principale

Esempio:

   var numbers = [2,3,5,7];

   var forEachNum = numbers.forEach(function(number){
      return number
   })
   console.log(forEachNum)
   //output undefined

   var mapNum = numbers.map(function(number){
      return number
   })
   console.log(mapNum)
   //output [2,3,5,7]

map () è più veloce di forEach ()



0

forEach () :

valore restituito: undefined

originalArray: modificato dopo la chiamata al metodo

mappa () :

valore di ritorno: nuovo Array popolato con i risultati della chiamata di una funzione fornita su ogni elemento dell'array chiamante

originalArray: non modificato dopo la chiamata al metodo

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.