Ответ
Метод map всегда возвращает новый массив. Длина нового массива всегда равна длине исходного. Каждый элемент нового массива — это результат вызова предоставленной callback-функции на соответствующем элементе исходного массива.
Базовый пример:
const numbers = [1, 2, 3];
const squares = numbers.map(num => num * num);
console.log(squares); // [1, 4, 9]
console.log(numbers === squares); // false (это новый массив)
Важные технические детали:
-
Возврат
undefined: Если callback-функция не возвращает значение явно, в новом массиве будетundefined.const result = [1, 2].map(num => { const doubled = num * 2; // Забыли return }); console.log(result); // [undefined, undefined] -
Исходный массив не изменяется:
mapявляется чистой функцией (pure function) и не мутирует исходный массив. Однако, если элементы — объекты, они копируются по ссылке.const users = [{ name: 'Alice' }, { name: 'Bob' }]; const usersWithId = users.map((user, index) => ({ ...user, // Создаём поверхностную копию объекта id: index })); users[0].name = 'Carol'; console.log(usersWithId[0].name); // 'Alice' (не изменилось) -
Обработка пустых элементов:
mapвызывает callback только для индексов, которым присвоено значение (включаяundefined). Он пропускает пустые элементы (empty slots) в разреженных массивах.const sparseArray = [1, , 3]; // Второй элемент — empty const mapped = sparseArray.map((x, i) => { console.log(`Index ${i}: ${x}`); // Index 0: 1, Index 2: 3 return x; }); console.log(mapped); // [1, empty, 3]
Используйте map, когда нужно трансформировать каждый элемент массива и получить новый массив результатов.
Ответ 18+ 🔞
А, ну вот, смотри, про этот ваш map, блядь. Это ж самая простая хуйня, если разобраться, но народ постоянно в неё втыкается, как баран в новые ворота. Суть в том, что он, этот map, всегда, блядь, возвращает новый массив, ёпта! Не старый, не переписанный, а новый, свеженасранный. И длина у него будет один в один, как у исходного. А что внутри? А внутри — результаты того, что твоя колбэк-функция наваяла на каждом элементе старого массива.
Смотри, как это просто, на примере:
const numbers = [1, 2, 3];
const squares = numbers.map(num => num * num);
console.log(squares); // [1, 4, 9]
console.log(numbers === squares); // false (это новый массив, ёпта!)
А теперь, блядь, технические подводные камни, на которых все и спотыкаются:
-
А где, сука,
return? Если твоя функция нихуя не возвращает, то в новом массиве будет красота —undefined. Во все дыры.const result = [1, 2].map(num => { const doubled = num * 2; // Забыли return, блядь! И чё? }); console.log(result); // [undefined, undefined] — вот и весь сказ, пизда. -
Исходный массив не трогает! Это святое, блядь,
map— чистая функция, он не мудак, чтобы портить то, с чем работал. Но! Если внутри массива лежат объекты, то они копируются по ссылке, ёбта. Хочешь, чтобы не менялись — делай копию, хитрая жопа.const users = [{ name: 'Alice' }, { name: 'Bob' }]; const usersWithId = users.map((user, index) => ({ ...user, // Вот, блядь, поверхностную копию делаем, чтоб не было сюрпризов id: index })); users[0].name = 'Carol'; // Меняем исходник console.log(usersWithId[0].name); // 'Alice' (а тут нихуя не изменилось, ура!) -
А с дырками в массиве что? Вот это, блядь, интересно.
mapработает только с тем, что есть. Пустые места (empty slots) он просто игнорирует, как будто их и нет. Не вызывает для них колбэк, сука, вообще.const sparseArray = [1, , 3]; // Второй элемент — пустота, пиздец. const mapped = sparseArray.map((x, i) => { console.log(`Index ${i}: ${x}`); // Index 0: 1, Index 2: 3. Второй индекс — в рот меня чих-пых, его нет! return x; }); console.log(mapped); // [1, empty, 3] — дырка так и осталась дыркой.
Вот и вся философия, блядь. Используй map, когда тебе надо пройтись по всему массиву и из каждого элемента сделать что-то новое, получив при этом отдельный, новый массив. Не усложняй, ёпта.