JavaScript: Unterschied zwischen .forEach () und .map ()


115

Ich weiß, dass es viele solche Themen gab. Und ich kenne die Grundlagen: .forEach()arbeitet mit dem ursprünglichen Array und .map()mit dem neuen.

In meinem Fall:

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);

Und das wird ausgegeben:

[ -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 ]

Ich kann nicht verstehen, warum die Verwendung von practiceÄnderungswerten von bto undefined.
Es tut mir leid, wenn dies eine dumme Frage ist, aber ich bin ziemlich neu in dieser Sprache und die Antworten, die ich bisher gefunden habe, haben mich nicht befriedigt.


49
So einfach ist das: .map Gibt ein neues Array zurück , während .forEach nichts zurückgegeben wird . Wenn Sie eine geänderte Form des vorherigen Arrays erhalten .mapmöchten, verwenden Sie grundsätzlich, wenn Sie dies nicht möchten, verwenden Sie .forEach.
user4642212


@Xufox - Ich habe dieses Thema rot geschrieben, bevor ich ein neues erstellt habe, aber die Antwort hat mich nicht zufriedengestellt.
DzikiChrzan

Sag nicht nur, dass es dich nicht befriedigt hat. Wie genau beantwortet es Ihre Frage nicht (haben Sie alle Antworten gelesen?)? Was ist Ihre spezifische Frage, die vom vorgeschlagenen doppelten Ziel nicht abgedeckt wird?
user4642212

@Xufox Diese Frage befasst sich mit selbst implementierten Funktionen und bezieht sich nicht wirklich auf die standardisierten ES5-Funktionen.
Poke

Antworten:


144

Sie sind nicht ein und dasselbe. Lassen Sie mich den Unterschied erklären.

forEach: Dies iteriert über eine Liste und wendet eine Operation mit Nebenwirkungen auf jedes Listenmitglied an (Beispiel: Speichern jedes Listenelements in der Datenbank)

map: Dies iteriert über eine Liste, transformiert jedes Mitglied dieser Liste und gibt eine andere Liste derselben Größe mit den transformierten Mitgliedern zurück (Beispiel: Transformieren der Liste von Zeichenfolgen in Großbuchstaben)

Verweise

Array.prototype.forEach () - JavaScript | MDN

Array.prototype.map () - JavaScript | MDN


4
Und wie Xufox sagte - .forEach gibt nichts zurück, das ist der Fall. Danke für die Hilfe! Ich werde diese Antwort in 10 Minuten markieren.
DzikiChrzan

Map Return List und für jeden nicht. OK
Ashad Nasim

62
  • Array.forEach "Führt eine bereitgestellte Funktion einmal pro Array-Element aus."

  • Array.map "Erstellt ein neues Array mit den Ergebnissen des Aufrufs einer bereitgestellten Funktion für jedes Element in diesem Array."

Gibt forEachalso eigentlich nichts zurück. Es ruft nur die Funktion für jedes Array-Element auf und dann ist es fertig. Was auch immer Sie innerhalb dieser aufgerufenen Funktion zurückgeben, wird einfach verworfen.

Auf der anderen Seite mapwird die Funktion für jedes Array-Element auf ähnliche Weise aufgerufen, aber anstatt den Rückgabewert zu verwerfen, wird sie erfasst und ein neues Array dieser Rückgabewerte erstellt.

Dies bedeutet auch , dass Sie könnte verwenden , mapwo immer Sie verwenden , forEachaber Sie sollten immer noch nicht tun, so dass Sie nicht sammeln die Rückgabewerte ohne einen bestimmten Zweck. Es ist nur effizienter, sie nicht zu sammeln, wenn Sie sie nicht benötigen.


Bemerkenswert: Im Jahr 2015 forEachwäre es wohl "effizienter" gewesen, als mapwenn insbesondere eine Polyfüllung für die Unterstützung forEacheines älteren Browsers (IE8 oder 9) erforderlich gewesen wäre . Sie müssen die Rückgabe von mapnichts zuweisen ; Der Rückgabewert sollte unmittelbar nach mapder Rückgabe Müll sammeln, wenn die Rückgabe von mapnicht zugewiesen ist.
Cowbert

3
@cowbert Nur weil etwas sofort Müll gesammelt wird, heißt das nicht, dass Sie nicht von den notwendigen Zuordnungen getroffen werden. Dies forEachwird konzeptionell noch effizienter und besser für Aufgaben geeignet sein, bei denen Sie keine Ergebnisse sammeln müssen. Und ich weiß nichts über dich, aber 2015 habe ich nicht mehr für IE8 entwickelt (was übrigens auch nicht unterstützt wurde map); und IE9 + Unterstützung forEach. Und tatsächlich beendete Microsoft einen Monat nach meiner Antwort die Unterstützung für diese Browser.
stupsen

Wird garantiert, dass sowohl forEach als auch map die Elemente in derselben Reihenfolge verarbeiten?
Quentin 2

1
@ Quentin2 Ja, auch sind beide Funktionen synchron, so mapund forEachwerden Anrufe zurückkehren nur einmal das gesamte Array geschleift wurde durch und der Rückruf für jeden aufgerufen wurde.
stupsen

23
+ ---------------- + -------------------------------- ----- + ----------------------------------- +
| | foreach | Karte |
+ ---------------- + -------------------------------- ----- + ----------------------------------- +
| Funktionalität | Führt eine bestimmte Operation für jeden | aus Führt die angegebene "Transformation" für | aus
| | Element des Arrays | "Kopie" jedes Elements |
+ ---------------- + -------------------------------- ----- + ----------------------------------- +
| Rückgabewert | Gibt undefinierte | zurück Gibt ein neues Array mit transformiertem | zurück
| | | Elemente, die das ursprüngliche Array zurücklassen |
| | | unverändert |
+ ---------------- + -------------------------------- ----- + ----------------------------------- +
| Bevorzugt | Nicht-Transformation durchführen wie | Array mit Ausgabe von | erhalten
| Nutzungsszenario | Verarbeitung für jedes Element. | Einige Verarbeitungen für jedes Element
| und Beispiel | | des Arrays. |
| | Speichern Sie beispielsweise alle Elemente in | |
| | die Datenbank | Beispiel: Erhalten eines Arrays von |
| | | Längen jeder Zeichenfolge in der |
| | | Array |
+ ---------------- + -------------------------------- ----- + ----------------------------------- +

Bitte bearbeiten Sie Ihren Beitrag und zeigen Sie den tatsächlichen Text anstelle von Bildern. Andere können nicht aus Ihrem Bild kopieren und einfügen, nicht in Ihrem Bild suchen oder den Textinhalt im Bild verbessern. Siehe hier für Details. Danke dir.
Pang

2
Dies kann Ihnen beim Zeichnen von ASCII- Kunsttabellen
Pang


7

forEach: Wenn Sie eine Aktion für die Elemente eines Arrays ausführen möchten und diese für die Schleife verwenden. Das Ergebnis dieser Methode gibt uns keine Ausgabe-Kauf-Schleife durch die Elemente.

map: Wenn Sie eine Aktion für die Elemente eines Arrays ausführen und die Ausgabe Ihrer Aktion in einem Array speichern möchten. Dies ähnelt der for-Schleife innerhalb einer Funktion, die das Ergebnis nach jeder Iteration zurückgibt.

Hoffe das hilft.


5

Der Unterschied liegt in dem, was sie zurückgeben. Nach der Ausführung:

arr.map()

gibt ein Array von Elementen zurück, die sich aus der verarbeiteten Funktion ergeben; während:

arr.forEach()

gibt undefiniert zurück.


5

Leistungsanalyse For-Schleifen sind schneller als map oder foreach, wenn die Anzahl der Elemente in einem Array zunimmt.

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');

Hier ist das Ergebnis auf meinem Computer:map: 1642ms forEach: 885ms for: 748ms
Flavio Vilante


1

Eine Sache, die hervorgehoben werden muss, ist, dass foreach nicht initialisierte Werte überspringt, während die Karte dies nicht tut.

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

Unterschied zwischen forEach () & map ()

forEach () durchläuft einfach die Elemente. Es wirft Rückgabewerte weg und gibt immer undefiniert zurück. Das Ergebnis dieser Methode gibt uns keine Ausgabe.

Die map () - Schleife durch die Elemente weist Speicher zu und speichert Rückgabewerte durch Iteration des Hauptarrays

Beispiel:

   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 () ist schneller als forEach ()



0

forEach () :

Rückgabewert: undefiniert

originalArray: nach dem Methodenaufruf geändert

map () :

Rückgabewert: Neues Array, das mit den Ergebnissen des Aufrufs einer bereitgestellten Funktion für jedes Element im aufrufenden Array gefüllt ist

originalArray: nach dem Methodenaufruf nicht geändert

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.