Co robi .map () w tej sytuacji?


95

Używając konsoli Chrome, oto moje dane wejściowe i wyjściowe:

[0].map(Array);

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

Co tu się dzieje?

EDYTOWAĆ

Powodem, dla którego to mnie zaciekawia, jest coś takiego

[0].map(String);

Wróci

["0"];

I nie

["0", "0", "String"]

34
Zakładam, ponieważ zawsze potrzebuje niektórych WTF JavaScript, aby czuć się szczęśliwy
npst

12
Och, to tylko mniej wtf-y wariant['10', '10', '10'].map(parseInt)
gronostaj

2
Kolejne dziwne .map()zachowanie: stackoverflow.com/questions/14528397/… Ogólnie rzecz biorąc, musisz być ostrożny podczas używania .map()funkcji, które wymagają więcej niż jednego argumentu.
Barmar

2
Po prostu zrób[0].map(console.log)
Bergi,

1
@Jacksonkr: Dzięki za odpowiedź. Myślę, że poszło tak: napisałem komentarz, wyjaśniając, że widok JS WTF sprawia, że ​​jestem szczęśliwy, że nie muszę często używać tego języka. Ktoś zapytał, dlaczego miałbym patrzeć na pytania JS, jeśli nie podoba mi się język. npst odpowiedział i pierwsze dwa komentarze zostały usunięte. To zabawne, że jego komentarz wciąż zyskuje uznanie, tak.
Eric Duminil

Odpowiedzi:


123

.map()Funkcja jest wywołanie Array()funkcji z trzech argumentów, wartości elementów układu, które ma 0wskaźnik tego elementu, a także 0i w odniesieniu do całej tablicy.

Więc to jest jak robienie tego:

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

Tablica zwrócona do Array()tego czasu staje się pierwszym elementem tablicy, która .map()tworzy, stąd dodatkowy poziom zagnieżdżenia w [[0, 0, [0]]]wyniku.

EDYTUJ dotyczące twojej edycji: kiedy mówisz, [0].map(String);że powoduje String()to wywołanie z tymi samymi trzema argumentami String(a[index], index, a), ale String()funkcja ignoruje wszystkie argumenty oprócz pierwszego, podczas gdy Array()używa wszystkich dostarczonych argumentów.


39

Po pierwsze , Arraymoże służyć jako funkcja do tworzenia tablic:

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

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

Po drugie , mapprzekazuje trzy parametry do swojego wywołania zwrotnego: element, jego indeks z tablicy i samą tablicę.

Tak więc , ponieważ twoja tablica zawiera jeden element, wiersz:

[0].map(Array);

jest równa:

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

6

Po zaktualizowaniu pytania. Inne odpowiedzi dostarczają informacji o mapie

Aby odpowiedzieć, dlaczego tablica i ciąg różnią się, spójrz na konstruktory

Konstruktor łańcuchowy akceptuje 1 parametr String (thing), podczas gdy tablica nowa Array (element0, element1 [, ... [, elementN]])


2
Z tego samego powodu .map(Number)konwertuje każdy przedmiot na liczbę, zamiast zwracać coś podobnego [3, 2, [4, 1, 3]]dla każdego elementu.
user4642212

@Xufox tak, odpowiedź jest w konstruktorach :)
Volodymyr Bilyachat

4

To wezwanie

[0].map(Array);

daje taki sam wynik, jak napisanie czegoś takiego:

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

Funkcja map wywołuje funkcję Array z trzema parametrami: wartością elementu, indeksem elementu i całą tablicą. To wywołanie Arrayzwraca tablicę z 3 elementami: wartość (liczba 0), indeks (liczba 0), cała tablica ( [0]).

Ta nowa tablica jest opakowana w oryginalną tablicę, ponieważ zmapowałeś oryginalny element (numer 0) na nowy element (tablica 3 elementów)

Uwaga: możesz przyzwyczaić się do używania tylko pierwszego parametru, takiego jak w

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

lub używając tylko dwóch, aby uzyskać również indeks

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

Ale musisz pamiętać, że mapnadal zapewnia 3 parametry, które po prostu ignorujesz w funkcji wywołania zwrotnego. Z tego też powodu kod taki jak:

[0].map(String);

zwroty

["0"]

Dzieje się tak, ponieważ funkcja String dba tylko o pierwszy parametr i ignoruje inne przekazane parametry. Jeśli zadzwonisz

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

nadal dostaniesz

"11"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.