web-dev-qa-db-de.com

Was ist der Unterschied zwischen .map, .every und .forEach?

Ich habe mich immer gefragt, was der Unterschied zwischen ihnen war. Sie scheinen alle dasselbe zu tun ...

107
0x499602D2

Der Unterschied liegt in den Rückgabewerten.

.map() gibt ein neues Array von Objekten zurück, das durch Ausführen einer Aktion für das ursprüngliche Element erstellt wurde.

.every() gibt einen booleschen Wert - true zurück, wenn jedes Element in diesem Array die angegebene Testfunktion erfüllt. Ein wichtiger Unterschied zu .every() besteht darin, dass die Testfunktion möglicherweise nicht immer für jedes Element im Array aufgerufen wird. Sobald die Testfunktion für ein Element false zurückgibt, werden keine Array-Elemente mehr iteriert. Daher sollte die Testfunktion normalerweise keine Nebenwirkungen haben.

.forEach() gibt nichts zurück - Durchläuft das Array und führt für jedes Element im Array eine bestimmte Aktion aus.

Lesen Sie mehr über diese und viele andere Array-Iterationsmethoden bei MDN .

207
gilly3

die Antwort von gilly3 ist großartig. Ich wollte nur ein paar Informationen über andere Arten von "Loop Through Elements" -Funktionen hinzufügen.

  • .every() (stoppt die Schleife, wenn der Iterator zum ersten Mal false oder etwas Falsches zurückgibt)
  • .some() (stoppt die Schleife, wenn der Iterator zum ersten Mal true oder etwas Wahres zurückgibt)
  • .filter() (erstellt ein neues Array mit Elementen, bei denen die Filterfunktion true zurückgibt, und lässt diejenigen weg, bei denen false zurückgegeben wird.)
  • .map() (erstellt ein neues Array aus den von der Iteratorfunktion zurückgegebenen Werten)
  • .reduce() (baut einen Wert durch wiederholtes Aufrufen des Iterators auf, wobei vorherige Werte übergeben werden; Einzelheiten finden Sie in der Spezifikation; nützlich zum Summieren des Inhalts eines Arrays und vielen anderen Dingen)
  • .reduceRight() (wie "Reduzieren", jedoch nicht in aufsteigender, sondern in absteigender Reihenfolge)

dank an: T.J.Crowder Für jeden über ein Array in JavaScript?

80

Eine weitere Überlegung zu den obigen großartigen Antworten ist die Verkettung. Mit forEach () können Sie nicht verketten, aber mit map () können Sie.

Beispielsweise:

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

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

mit .forEach () können Sie die .sort () nicht ausführen, es wird eine Fehlermeldung angezeigt.

5
Nadine Rose

Für Ramda ist der Unterschied zwischen R.map() und R.forEach() :

  1. R.forEach() gibt das ursprüngliche Array zurück, während R.map() einen Funktor zurückgibt
  2. R.forEach() kann nur auf ein Array angewendet werden, R.map() kann jedoch auch auf ein Objekt angewendet werden (d. h. die Schlüssel/Wert-Paare des Objekts werden wie ein Array behandelt)
0
Michael Osofsky