Was macht .map () in dieser Situation?

95

Bei Verwendung der Chrome-Konsole ist dies meine Eingabe und Ausgabe:

[0].map(Array);

[[0, 0, [0]]]; // output

Was passiert hier?

BEARBEITEN

Der Grund, warum mich das neugierig macht, ist so etwas

[0].map(String);

Wird zurückkehren

["0"];

Und nicht

["0", "0", "String"]
Jacksonkr
quelle
34
Ich nehme an, weil er immer einige Javascript WTFs braucht, um sich glücklich zu fühlen
npst
12
Oh, es ist nur eine weniger gewichtige Variante von['10', '10', '10'].map(parseInt)
gronostaj
2
Ein weiteres seltsames .map()Verhalten: stackoverflow.com/questions/14528397/… Im Allgemeinen müssen Sie vorsichtig sein, wenn Sie .map()Funktionen verwenden, die mehr als ein Argument enthalten.
Barmar
2
Tun [0].map(console.log)
Sie es
1
@ Jacksonkr: Danke für die Antwort. Ich denke, es ging so: Ich schrieb einen Kommentar, in dem ich erklärte, dass es mich glücklich macht, JS WTFs zu sehen, dass ich die Sprache nicht oft verwenden muss. Jemand fragte, warum ich mir JS-Fragen ansehen würde, wenn mir die Sprache nicht gefällt. npst antwortete und die ersten beiden Kommentare wurden gelöscht. Es ist lustig, dass sein Kommentar immer noch positiv bewertet wird, ja.
Eric Duminil

Antworten:

123

Die .map()Funktion ruft die Array()Funktion mit drei Argumenten auf, dem Wert des Array-Elements 0, dem Index dieses Elements 0und einem Verweis auf das gesamte Array.

Also ist es so:

var a = [0];
var index = 0
Array(a[index], index, a);   // create array with three elements

Das bis dahin zurückgegebene Array Array()wird zum ersten Element des Arrays, das .map()erstellt wird, daher die zusätzliche Verschachtelungsebene in Ihrem [[0, 0, [0]]]Ergebnis.

BEARBEITEN bezüglich Ihrer Bearbeitung: Wenn Sie sagen, [0].map(String);dass dies dazu führt, String()dass mit denselben drei Argumenten wie aufgerufen String(a[index], index, a)wird, die String()Funktion jedoch alle bis auf das erste Argument ignoriert, während Array()alle angegebenen Argumente verwendet werden.

nnnnnn
quelle
39

Erstens , Arrayals Funktion verwendet werden könnten Arrays zu erstellen:

var arr = Array(1, 2, "Hello");

console.log(arr); // [1, 2, "Hello"]

Zweitens werden mapdrei Parameter an den Rückruf übergeben: das Element, sein Index aus dem Array und das Array selbst.

Also , da Ihr Array enthält ein Element, die Zeile:

[0].map(Array);

ist äquivalent zu:

[Array(0, 0, [0])];     // the element 0 in the original array will be mapped into Array(0, 0, [0])
ibrahim mahrir
quelle
6

Nachdem Sie die Frage aktualisiert haben. Andere Antworten geben Ihnen Informationen über die Karte

Um zu beantworten, warum sich Array und String unterscheiden, wenden Sie sich an Konstruktoren

String-Konstruktor akzeptiert 1 Parameter String (Ding), während Array neues Array (Element0, Element1 [, ... [, ElementN]])

Volodymyr Bilyachat
quelle
2
Es ist der gleiche Grund, warum .map(Number)jeder Artikel in eine Zahl umgewandelt wird, anstatt [3, 2, [4, 1, 3]]für jeden Artikel so etwas zurückzugeben.
user4642212
@Xufox ja Antwort ist in Konstruktoren :)
Volodymyr Bilyachat
4

Dieser Anruf

[0].map(Array);

gibt Ihnen das gleiche Ergebnis, als ob Sie so etwas geschrieben hätten:

[0].map(function (value, index, array) {
    return Array(value, index, array);
})

Die Map- Funktion ruft die Array- Funktion mit drei Parametern auf: Wert des Elements, Index des Elements und gesamtes Array. Dieser Aufruf Arraygibt Ihnen ein Array mit 3 Elementen zurück: Wert (Nummer 0), Index (Nummer 0), ganzes Array ( [0]).

Und dieses neue Array wird in das ursprüngliche Array eingeschlossen, da Sie das ursprüngliche Element (Nummer 0) einem neuen Element (Array mit 3 Elementen) zugeordnet haben.

Hinweis: Möglicherweise sind Sie es gewohnt, nur den ersten Parameter wie in zu verwenden

array.map(function (a) { return a * a; });

oder verwenden Sie nur zwei, um auch Index zu erhalten

array.map(function (item, index) { return "index=" + index + ", value=" + item; });

Sie müssen sich jedoch daran erinnern, dass es mapimmer noch 3 Parameter gibt, die Sie in Ihrer Rückruffunktion einfach ignorieren. Das ist auch der Grund, warum Code wie:

[0].map(String);

kehrt zurück

["0"]

Es ist weil String Funktion nur um den ersten Parameter kümmert und andere übergebene Parameter ignoriert. Wenn Sie anrufen

String(11, "Some", "other", "ignored", "parameters")

du wirst immer noch bekommen

"11"
Mariusz Pawelski
quelle