Що робить .map () у цій ситуації?


95

За допомогою консолі Chrome це мій вхід і вихід:

[0].map(Array);

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

Що тут відбувається?

EDIT

Причина, через яку мені стає цікаво, полягає в тому, що щось на зразок

[0].map(String);

Повернеться

["0"];

І ні

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

34
Я припускаю, тому що йому завжди потрібні деякі Javascript WTF, щоб відчувати себе щасливим
npst

12
О, це просто менш wtf-y варіант['10', '10', '10'].map(parseInt)
gronostaj

2
Ще одна дивна .map()поведінка: stackoverflow.com/questions/14528397/… Загалом, ви повинні бути обережними при використанні .map()з функціями, які приймають більше одного аргументу.
Barmar

2
Just do[0].map(console.log)
Bergi

1
@Jacksonkr: Дякую за відповідь. Я думаю, це пройшло так: я написав коментар, пояснюючи, що перегляд JS WTF мене радує, що мені не доводиться часто користуватися цією мовою. Хтось запитав, чому я дивлюся на питання JS, якщо мені не подобається мова. npst відповів, і перші два коментарі були видалені. Смішно, що його коментар все ще отримує підтримку, так.
Ерік Думініл,

Відповіді:


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]]]результат.

EDIT щодо вашого редагування: коли ви говорите, [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

Після оновлення запитання. Інші відповіді дають вам інформацію про карту

Щоб відповісти, чому масив і рядок відрізняються, зверніться до конструкторів

Конструктор рядка приймає 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);
})

Функція Map викликає функцію 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.