Что делает .map () в этой ситуации?

95

Используя консоль Chrome, это мой ввод и вывод:

[0].map(Array);

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

Что здесь происходит?

РЕДАКТИРОВАТЬ

Это вызывает у меня любопытство, потому что что-то вроде

[0].map(String);

Вернется

["0"];

И нет

["0", "0", "String"]
Джексонкр
источник
34
Я предполагаю, потому что ему всегда нужны некоторые Javascript WTF, чтобы чувствовать себя счастливым
npst
12
О, это просто менее ['10', '10', '10'].map(parseInt)
дурацкий
2
Еще одно странное .map()поведение: stackoverflow.com/questions/14528397/… В общем, вы должны быть осторожны при использовании .map()с функциями, которые принимают более одного аргумента.
Barmar
2
Просто сделай[0].map(console.log)
Берги
1
@Jacksonkr: Спасибо за ответ. Я думаю, это было примерно так: я написал комментарий, объясняя, что вид JS WTF делает меня счастливым, что мне не нужно часто использовать этот язык. Кто-то спросил, зачем мне смотреть на JS-вопросы, если мне не нравится язык. npst ответил, и первые два комментария были удалены. Забавно, что за его комментарий до сих пор голосуют, да.
Eric

Ответы:

123

.map()Функция является вызов Array()функции с тремя аргументами, значением элемента массива , который 0, индекс этого элемента, а также 0, и ссылкой на весь массив.

Вот так:

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

Возвращенный к этому моменту массив Array()становится первым элементом создаваемого массива .map(), следовательно, в вашем [[0, 0, [0]]]результате появляется дополнительный уровень вложенности .

ИЗМЕНИТЬ в отношении вашего редактирования: когда вы говорите, [0].map(String);что в результате String()вызывается с теми же тремя аргументами, как String(a[index], index, a), но String()функция игнорирует все, кроме первого аргумента, тогда как Array()использует все предоставленные аргументы.

ннннн
источник
39

Во-первых , Arrayможет использоваться как функция для создания массивов:

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

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

Во-вторых , mapсвоему обратному вызову передает три параметра: элемент, его индекс из массива и сам массив.

Итак , поскольку ваш массив содержит один элемент, строка:

[0].map(Array);

эквивалентно:

[Array(0, 0, [0])];     // the element 0 in the original array will be mapped into Array(0, 0, [0])
ибрахим махрир
источник
6

После того, как вы обновили вопрос. Другие ответы предоставляют вам информацию о карте

Чтобы ответить, почему массив и строка различаются, взгляните на конструкторы

Конструктор String принимает 1 параметр String (thing), а массив new Array (element0, element1 [, ... [, elementN]])

Владимир Билячат
источник
2
По этой же причине .map(Number)каждый элемент преобразуется в число, а не возвращается что-то подобное [3, 2, [4, 1, 3]]для каждого элемента.
user4642212
@Xufox да ответ в конструкторах :)
Владимир
4

Этот звонок

[0].map(Array);

дает такой же результат, как если бы вы написали что-то вроде этого:

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

Функция карты вызывает функцию массива с тремя параметрами: значением элемента, индексом элемента и целым массивом. Этот вызов Arrayвозвращает вам массив с 3 элементами: значение (число 0), индекс (число 0), весь массив ( [0]).

И этот новый массив обернут в исходный массив, потому что вы сопоставили исходный элемент (номер 0) с новым элементом (массив из 3 элементов)

Примечание: вы могли использовать только первый параметр, как в

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

или используя всего два, чтобы получить также индекс

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

Но вы должны помнить, что по- mapпрежнему предоставляет 3 параметра, которые вы просто игнорируете в своей функции обратного вызова. Это также причина того, почему код вроде:

[0].map(String);

возвращается

["0"]

Это потому, что функция String заботится только о первом параметре и игнорирует другие переданные параметры. Если вы позвоните

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

ты все равно получишь

"11"
Мариуш Павельски
источник