Для чего используется метод map() в JavaScript?

Ответ

Метод map() используется для трансформации (отображения) каждого элемента массива в новый элемент, создавая и возвращая новый массив той же длины. Это один из ключевых методов функционального программирования в JavaScript и Node.js.

Синтаксис и пример:

const newArray = array.map((currentValue, index, array) => {
  // Возвращаем новое значение для newArray[index]
}, thisArg);

Практические примеры в Node.js:

  1. Преобразование данных из БД для API-ответа:

    const dbUsers = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
    const apiResponse = dbUsers.map(user => ({
      userId: user.id,
      fullName: user.name.toUpperCase()
    }));
    // apiResponse: [{ userId: 1, fullName: 'ALICE' }, ...]
  2. Извлечение конкретных полей из массива объектов:

    const requests = [{ url: '/api' }, { url: '/users' }];
    const urls = requests.map(req => req.url); // ['/api', '/users']
  3. Нормализация данных:

    const stringIds = ['123', '456', '789'];
    const numericIds = stringIds.map(id => parseInt(id, 10)); // [123, 456, 789]

Ключевые особенности:

  • Иммутабельный: Не изменяет исходный массив.
  • Предсказуемый: Возвращает массив той же длины.
  • Чистая функция: Колбэк должен быть без побочных эффектов (side-effects).

Не путать с forEach: forEach выполняет операцию для каждого элемента, но не возвращает новый массив. map предназначен именно для трансформации данных.

Ответ 18+ 🔞

А, ну слушай, вот этот map() — это вообще, бля, золотая жила в JavaScript, ебать мои старые костыли. Представь, у тебя есть массив, как мешок картошки. И тебе надо не просто её перебрать, а каждую картофелину, например, почистить, нарезать и обжарить. Вот map() — это твой личный повар-трансформер. Он берет каждый элемент, делает с ним что ты скажешь, и кладёт результат в новый, отдельный тазик. Исходная картошка в мешке остаётся нетронутой — это святое, иммутабельность, ёпта.

Синтаксис, если по-простому:

const новыйМассив = старыйМассив.map((текущийЭлемент, индекс, самМассив) => {
  // Тут ты из текущего элемента делаешь что-то новое и возвращаешь это
}, thisArg); // этот thisArg — редко кто использует, честно говоря, но он есть

Смотри, где это в жизни пригождается, прямо в Node.js:

  1. Выдрать из пользователей только нужные поля для ответа API. Чтоб лишнего не светить, понимаешь? Подозрение ебать чувствую, когда всё наружу торчит.

    const пользователиИзБазы = [{ id: 1, name: 'Вася' }, { id: 2, name: 'Петя' }];
    const ответДляФронта = пользователиИзБазы.map(user => ({
      айдишник: user.id,
      имяПолное: user.name.toUpperCase() // И сразу капсом, чтоб солидно
    }));
    // ответДляФронта: [{ айдишник: 1, имяПолное: 'ВАСЯ' }, ...]
  2. Из кучи объектов выковырять одно поле. Типа, у тебя массив запросов, а тебе только URL'ы.

    const запросы = [{ url: '/api' }, { url: '/users' }];
    const адреса = запросы.map(req => req.url); // ['/api', '/users']
    // Всё, больше ничего не надо. Красота, а не жизнь.
  3. Привести данные к нормальному виду. Например, строковые ID превратить в нормальные числа, а то потом в сравнениях нихуя не сработает.

    const строковыеАйди = ['123', '456', '789'];
    const числовыеАйди = строковыеАйди.map(id => parseInt(id, 10)); // [123, 456, 789]
    // Теперь можно спокойно искать и сравнивать, без этих вот "123" == 123.

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

  • Он не портит исходник! Исходный массив остаётся как был. Это овердохуища важно.
  • Что положил, то и получил. Новый массив будет ровно такой же длины. Не может он элемент проглотить или новый из воздуха сделать.
  • Колбэк должен быть чистым. Не надо там в колбэке глобальные переменные менять или в базу писать. Его задача — взять элемент, вернуть новое значение. И всё. Чёрта в душу, в сердцу мать!

И главное — не путай с forEach! Это частая ошибка, чувак. forEach — это как пройтись по массиву и что-то сделать для каждого элемента (например, в консоль вывести или в файл записать). Он нихуя не возвращает, просто идёт и делает. А map() — он для трансформации, он возвращает новый массив. Если ты используешь map() и не используешь возвращаемый массив — ты делаешь что-то не то, скорее всего тебе нужен был forEach. Э, бошка думай!