Der einzige Unterschied, den ich in map und foreach sehe, besteht darin, dass map
ein Array zurückgegeben wird und forEach
nicht. Ich verstehe jedoch nicht einmal die letzte Zeile der forEach
Methode " func.call(scope, this[i], i, this);
". Zum Beispiel ist nicht „ this
“ und „ scope
“ bezieht sich auf denselben Gegenstand und ist nicht this[i]
und unter i
Bezugnahme auf den aktuellen Wert in der Schleife?
In einem anderen Beitrag ist mir aufgefallen, dass jemand sagte: "Verwenden forEach
Sie diese Option, wenn Sie auf der Grundlage der einzelnen Elemente der Liste etwas tun möchten. Möglicherweise fügen Sie der Seite beispielsweise Dinge hinzu. Im Wesentlichen ist dies ideal, wenn Sie" Nebenwirkungen "wünschen. Ich weiß nicht, was unter Nebenwirkungen zu verstehen ist.
Array.prototype.map = function(fnc) {
var a = new Array(this.length);
for (var i = 0; i < this.length; i++) {
a[i] = fnc(this[i]);
}
return a;
}
Array.prototype.forEach = function(func, scope) {
scope = scope || this;
for (var i = 0, l = this.length; i < l; i++) {
func.call(scope, this[i], i, this);
}
}
Gibt es schließlich echte Verwendungsmöglichkeiten für diese Methoden in Javascript (da wir keine Datenbank aktualisieren), außer um Zahlen wie diese zu manipulieren:
alert([1,2,3,4].map(function(x){ return x + 1})); //this is the only example I ever see of map in javascript.
Vielen Dank für jede Antwort.
quelle
map
und getan habenforEach
? Alles, was ich von Google bekomme, sind Nutzungsspezifikationen und Tutorials.Antworten:
Der wesentliche Unterschied zwischen
map
undforEach
in Ihrem Beispiel besteht darin, dassforEach
die ursprünglichen Array-Elemente verarbeitet werden, währendmap
als Ergebnis explizit ein neues Array zurückgegeben wird.Mit
forEach
ergreifen Sie eine Aktion mit - und ändern Sie optional - jedes Element im ursprünglichen Array. DieforEach
Methode führt die von Ihnen für jedes Element bereitgestellte Funktion aus, gibt jedoch nichts zurück (undefined
). Geht andererseitsmap
durch das Array, wendet eine Funktion auf jedes Element an und gibt das Ergebnis als neues Array aus .Der "Nebeneffekt"
forEach
ist, dass das ursprüngliche Array geändert wird. "Keine Nebenwirkung"map
bedeutet, dass bei der idiomatischen Verwendung die ursprünglichen Array-Elemente nicht geändert werden. Das neue Array ist eine Eins-zu-Eins-Zuordnung jedes Elements im ursprünglichen Array. Die Zuordnungstransformation ist Ihre bereitgestellte Funktion.Die Tatsache, dass keine Datenbank beteiligt ist, bedeutet nicht, dass Sie nicht mit Datenstrukturen arbeiten müssen, was schließlich eine der Essenzen der Programmierung in jeder Sprache ist. Was Ihre letzte Frage betrifft, kann Ihr Array nicht nur Zahlen, sondern auch Objekte, Zeichenfolgen, Funktionen usw. enthalten.
quelle
.map
kann alles, was.forEach
kann (einschließlich des Änderns von Elementen), gibt nur eine neue Liste zurück, die aus der Iteratorfunktion erstellt wurde..map()
Erstellt ein neues Array und ändert das Original nicht. Sie könnten zwar das Array ändern, das selbst zugeordnet wird, aber das wäre zumindest nicht idiomatisch, wenn nicht unsinnig..forEach()
Obwohl ähnlich, wendet es seine Funktion auf jedes Element an, gibt aber immer zurückundefined
. Ungeachtet all dessen fragt das OP auch nach seinen eigenen spezifischen Funktionen, die dem Array-Prototyp hinzugefügt wurden. In der Vergangenheit gab es hier kein ES5.forEach
dem Sie nichts anfangen könnenmap
. Sie könnten sich einfach nicht um den Rückgabewert von kümmernmap
und Sie hätten einenforEach
. Der Unterschied besteht darin, dass die Verwendungmap
für Aufgaben, bei denen Sie kein neues Array basierend auf den Ergebnissen erstellen möchten, sehr ineffektiv ist . Also für diejenigen, die Sie verwendenforEach
.for
Schleife alles machen, was du brauchst . Ich bin nicht anderer Meinung, dass es einen Unterschied in der "Effektivität" gibt, aber ich glaube auch nicht, dass irgendjemand argumentiert, dass einer etwas Magie hat, den der andere irgendwie nicht erreichen kann. Obwohl es tatsächlich eine Sache gibt,map
die nicht möglich ist: kein Array zurückzugeben. Es gibt Wert JS aus anderen Sprachen leben bis zu Erwartungen in, wie sie sich auf das Verhalten der funktionellen Favoriten wiemap
,reduce
,filter
usw. Zum Beispiel, Sie implementieren könntenreduceRight
Ähnliche Bausteine verwenden, aber warum nicht einfach verwendenreduceRight
?b.val = b.val**2
innerhalb des zurückgegebenen Objekts zugewiesen wird . Das ist genau das, was wir sagen, ist zwar möglich, aber verwirrend und nicht idiomatisch. Normalerweise geben Sie einfach den neuen Wert zurück und weisen ihn nicht auch dem ursprünglichen Array zu:a=[{val:1},{val:2},{val:3},{val:4}]; a.map((b)=>{b.val**2}); JSON.stringify(a);
Der Hauptunterschied zwischen den beiden Methoden ist konzeptionell und stilistisch: Sie verwenden,
forEach
wenn Sie etwas mit oder mit jedem Element eines Arrays tun möchten ("mit" ist das, was der von Ihnen zitierte Beitrag mit "Nebenwirkungen" meint, denke ich). , während Sie verwenden,map
wenn Sie jedes Element eines Arrays kopieren und transformieren möchten (ohne das Original zu ändern).Da beide
map
undforEach
eine Funktion für jedes Element in einem Array aufrufen und diese Funktion benutzerdefiniert ist, können Sie fast nichts mit dem einen und nicht mit dem anderen tun. Es ist zwar hässlich,map
ein Array an Ort und Stelle zu ändern und / oder etwas mit Array-Elementen zu tun:aber viel sauberer und offensichtlicher in Bezug auf Ihre Absicht zu verwenden
forEach
:Insbesondere wenn es sich, wie es in der realen Welt normalerweise der Fall
el
ist , um eine nützliche, für Menschen lesbare Variable handelt:Auf die gleiche Weise können Sie ganz einfach
forEach
ein neues Array erstellen:aber es ist sauberer zu benutzen
map
:Beachten Sie auch, dass
map
ein neues Array wahrscheinlich zumindest einige Leistungs- / Speichereinbußen erleidet, wenn Sie lediglich eine Iteration benötigen, insbesondere für große Arrays - siehe http://jsperf.com/map-foreachWarum Sie diese Funktionen verwenden möchten, ist immer dann hilfreich, wenn Sie eine Array-Manipulation in Javascript durchführen müssen, was (selbst wenn es sich nur um Javascript in einer Browser-Umgebung handelt) ziemlich oft und fast immer vorkommt Sie greifen auf ein Array zu, das Sie nicht manuell in Ihren Code schreiben. Möglicherweise handelt es sich um ein Array von DOM-Elementen auf der Seite oder um Daten, die aus einer AJAX-Anforderung abgerufen wurden, oder um Daten, die vom Benutzer in ein Formular eingegeben wurden. Ein häufiges Beispiel ist das Abrufen von Daten aus einer externen API, mit der Sie
map
die Daten möglicherweise in das gewünschte Format umwandeln und dannforEach
über Ihr neues Array iterieren möchten , um sie Ihrem Benutzer anzuzeigen.quelle
.map()
ständig Inline-Elemente ändern. Ich hatte den Eindruck , dass der Hauptvorteil der Verwendung war.map
über.forEach
.map
kann Elemente ändern, ja, aber es würde ein Array erstellen, das Sie nicht benötigen. Sie sollten auch überlegen, wie die Wahl des einen oder anderen den Leser erraten lässt, ob Sie Nebenwirkungen haben oder nichtDie gewählte Antwort (von Ken Redler) ist irreführend.
Ein Nebeneffekt in der Informatik bedeutet, dass eine Eigenschaft einer Funktion / Methode einen globalen Zustand verändert [Wiki] . In einem engen Sinne kann dies auch das Lesen aus einem globalen Zustand und nicht aus Argumenten umfassen. Bei der Imperativ- oder OO-Programmierung treten die meisten Nebenwirkungen auf. Und Sie nutzen es wahrscheinlich, ohne es zu merken.
Der wesentliche Unterschied zwischen
forEach
undmap
besteht darin, dassmap
Speicher zugewiesen und der Rückgabewert gespeichert wird, während erforEach
weggeworfen wird. Weitere Informationen finden Sie in der emca-Spezifikation .Der Grund, warum Leute sagen,
forEach
wird verwendet, wenn Sie einen Nebeneffekt wollen, ist, dass der Rückgabewert vonforEach
immer istundefined
. Wenn es keine Nebenwirkungen hat (den globalen Status nicht ändert), verschwendet die Funktion nur CPU-Zeit. Ein optimierender Compiler entfernt diesen Codeblock und ersetzt ihn durch den Endwert (undefined
).Übrigens sollte beachtet werden, dass JavaScript keine Einschränkungen für Nebenwirkungen hat. Sie können das ursprüngliche Array weiterhin ändern
map
.quelle
Dies ist eine schöne Frage mit einer unerwarteten Antwort.
Das Folgende basiert auf der offiziellen Beschreibung von
Array.prototype.map()
.Es gibt nichts ,
forEach()
was dasmap()
nicht kann. Das heißt,map()
ist eine strenge Supermenge vonforEach()
.Obwohl
map()
normalerweise zum Erstellen eines neuen Arrays verwendet wird, kann es auch zum Ändern des aktuellen Arrays verwendet werden. Das folgende Beispiel veranschaulicht dies:Im obigen Beispiel
a
wurde zweckmäßigerweise so eingestellt, dassa[i] === i
zi < a.length
. Trotzdem zeigt es die Leistungsfähigkeitmap()
und insbesondere die Fähigkeit, das Array, auf dem es aufgerufen wird, zu ändern.Anmerkung 1:
Die offizielle Beschreibung impliziert, dass
map()
sich die Länge des Arrays, auf dem es aufgerufen wird , sogar ändern kann ! Ich kann jedoch keinen (guten) Grund dafür sehen.Hinweis 2:
Während
map()
Map eine Super-Menge von istforEach()
,forEach()
sollte es immer noch verwendet werden, wenn man die Änderung eines bestimmten Arrays wünscht. Dies macht Ihre Absichten klar.Hoffe das hat geholfen.
quelle
mapped = a.map(function (x, i, arr) { arr[i] = x * x * x; return x * x; });.
a.forEach(function(x, i, arr) { ...
, was wiederum eine konzeptionell korrektere Methode ist, wenn Sie beabsichtigen, jedes Originalelement zu mutieren , anstatt Werte von einem Array auf ein anderes abzubildenSie können verwenden,
map
als ob es wäreforEach
.Es wird jedoch mehr tun als nötig.
scope
kann ein beliebiges Objekt sein; es ist keineswegs notwendigthis
.Ob es echte Verwendungen für
map
und gibt undforEach
ob es echte Verwendungen fürfor
oderwhile
Schleifen gibt.quelle
scope = scope || this
bedeutet "wennscope
falsch ist (undefiniert, null, falsch usw.), setzen Sie den Bereichthis
stattdessen auf und fahren Sie fort".Während alle vorherigen Fragen richtig sind, würde ich definitiv eine andere Unterscheidung treffen. Die Verwendung von
map
undforEach
kann Absicht implizieren.Ich verwende es gerne,
map
wenn ich einfach die vorhandenen Daten auf irgendeine Weise transformiere (aber sicherstellen möchte, dass die Originaldaten unverändert bleiben.Ich verwende es gerne,
forEach
wenn ich die vorhandene Sammlung ändere.Zum Beispiel,
Meine Faustregel sicher zu sein , machen , wenn Sie
map
Sie sind immer etwas neues Objekt / Wert zu schaffen für jedes Element der Quellliste zurückzukehren und Rückkehr es nicht nur auf jedem Element eine Operation durchgeführt wird .Sofern Sie die vorhandene Liste nicht wirklich ändern müssen, ist es nicht wirklich sinnvoll, sie an Ort und Stelle zu ändern, und sie passt besser in funktionale / unveränderliche Programmierstile.
quelle
Ich fühle mich wieder wie ein Nekromant, der eine Antwort auf eine Frage hinzufügt, die vor 5 Jahren gestellt wurde (zum Glück gibt es ziemlich neue Aktivitäten, also bin ich nicht der einzige, der die Toten stört :).
Andere haben bereits über Ihre Hauptfrage bezüglich des Unterschieds zwischen den Funktionen geschrieben. Aber für...
... es ist lustig, dass du fragen solltest. Erst heute habe ich einen Code geschrieben, der eine Reihe von Werten aus einem regulären Ausdruck mehreren Variablen zuweist, wobei map zur Transformation verwendet wird. Es wurde verwendet, um eine sehr komplizierte textbasierte Struktur in visualisierbare Daten umzuwandeln ... aber der Einfachheit halber werde ich ein Beispiel mit Datumszeichenfolgen anbieten, da diese wahrscheinlich für alle vertrauter sind (obwohl mein Problem tatsächlich mit Datumsangaben bestand Anstelle einer Karte hätte ich ein Date-Objekt verwendet, das die Arbeit von sich aus hervorragend erledigt hätte.
Also ... während dies nur ein Beispiel war - und nur eine sehr grundlegende Transformation für die Daten durchgeführt hat (nur zum Beispiel) ... wäre dies ohne Karte eine viel mühsamere Aufgabe gewesen.
Zugegeben, wird es in einer Version von JavaScript geschrieben , dass ich nicht glaube , zu viele Browser unterstützen noch (zumindest voll) , aber - wir sind immer da. Wenn ich es im Browser ausführen müsste, würde es meiner Meinung nach gut transpilieren.
quelle
TL; DR Antwort -
map gibt immer ein anderes Array zurück.
forEach nicht. Es liegt an Ihnen zu entscheiden, was es tut. Geben Sie ein Array zurück, wenn Sie möchten, oder tun Sie etwas anderes, wenn Sie dies nicht tun.
Flexibilität ist in bestimmten Situationen wünschenswert. Wenn es nicht das ist, womit Sie es zu tun haben, verwenden Sie die Karte.
quelle