Array.prototype.map()
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Сводка
Методmap()
создаёт новый массив с результатом вызова указанной функции для каждого элемента массива.
Синтаксис
const new_array = arr.map(function callback( currentValue[, index[, array]]) { // Возвращает элемент для new_array}[, thisArg])
Параметры
callback
Функция, вызываемая для каждого элемента массива
arr
. Каждый раз, когдаcallback
выполняется, возвращаемое значение добавляется вnew_array
.Функция
callback
, создающая элемент в новом массиве, принимает три аргумента:currentValue
Текущий обрабатываемый элемент массива.
index
НеобязательныйИндекс текущего обрабатываемого элемента в массиве.
array
НеобязательныйМассив, по которому осуществляется проход.
thisArg
НеобязательныйНеобязательный параметр. Значение, используемое в качестве
this
при вызове функцииcallback
Возвращаемое значение
Новый массив, где каждый элемент является результатомcallback
функции.
Описание
Методmap
вызывает переданную функциюcallback
один раз для каждого элемента, в порядке их появления и конструирует новый массив из результатов её вызова. Функцияcallback
вызывается только для индексов массива, имеющих присвоенные значения, включаяundefined
. Она не вызывается для пропущенных элементов массива (то есть для индексов, которые никогда не были заданы, которые были удалены или которым никогда не было присвоено значение.
Функцияcallback
вызывается с тремя аргументами: значением элемента, индексом элемента и массивом, по которому осуществляется проход.
Если в методmap
был передан параметрthisArg
, при вызовеcallback
он будет использоваться в качестве значенияthis
. В противном случае в качестве значенияthis
будет использоваться значениеundefined
. В конечном итоге, значениеthis
, наблюдаемое из функцииcallback
, определяется согласнообычным правилам определенияthis
, видимого из функции.
Методmap
не изменяет массив, для которого он был вызван (хотя функцияcallback
может это делать).
Диапазон элементов, обрабатываемых методомmap
, устанавливается до первого вызова функцииcallback
. Элементы, добавленные в массив после начала выполнения методаmap
, не будут посещены функциейcallback
. Если существующие элементы массива изменяются функциейcallback
, их значения, переданные в функцию, будут значениями на тот момент времени, когда методmap
посетит их; удалённые элементы посещены не будут.
Примеры
Пример: отображение массива чисел на массив квадратных корней
Следующий код берёт массив чисел и создаёт новый массив, содержащий квадратные корни чисел из первого массива.
const numbers = [1, 4, 9];const roots = numbers.map(Math.sqrt);// теперь roots равен [1, 2, 3], а numbers всё ещё равен [1, 4, 9]
Пример: отображение массива чисел с использованием функции, содержащей аргумент
Следующий код показывает, как работает отображение, когда функция требует один аргумент. Аргумент будет автоматически присваиваться каждому элементу массива, когдаmap
проходит по оригинальному массиву.
const numbers = [1, 4, 9];const doubles = numbers.map((num) => num * 2);// теперь doubles равен [2, 8, 18], а numbers всё ещё равен [1, 4, 9]
Пример: обобщённое использованиеmap
Этот пример показывает, как использоватьmap
на объекте строкиString
для получения массива байт в кодировке ASCII, представляющего значения символов:
const map = Array.prototype.map;const charCodes = map.call("Hello World", (x) => x.charCodeAt(0));// теперь charCodes равен [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
Пример: обобщённое использованиеmap
вместе сquerySelectorAll
Этот пример показывает, как пройтись по коллекции объектов, собранных с помощьюquerySelectorAll
. В данном случае мы получаем все выбранные опции на экране и печатаем их в консоль:
const elems = document.querySelectorAll("select option:checked");const values = Array.prototype.map.call(elems, ({ value }) => value);
Более простым способом будет использование методаArray.from()
.
Пример: использованиеmap
для переворачивания строки
const string = "12345";const reversed = Array.prototype.map .call(string, (x) => x) .reverse() .join("");// reversed равен '54321'// Бонус: используйте '===' для проверки того, является ли строка палиндромом
Более простым способом будет использование методаString.split()
(см. примеробращение строки при помощи метода split()).
Пример: хитрый вариант использования
(навеяно этой записью в блоге)
Распространённой практикой является использование колбэк-функции с одним аргументом (элемент, над которым производится операция). Некоторые функции также широко используется с одним аргументом, хотя они принимают дополнительные необязательные аргументы. Эти привычки могут привести к неожиданному поведению программы.
// Рассмотрим пример:["1", "2", "3"].map(parseInt);// Хотя ожидаемый результат вызова равен [1, 2, 3],// в действительности получаем [1, NaN, NaN]// Функция parseInt часто используется с одним аргументом, но она принимает два.// Первый аргумент является выражением, а второй - основанием системы счисления.// В функцию callback Array.prototype.map передаёт 3 аргумента:// элемент, его индекс и сам массив.// Третий аргумент игнорируется parseInt, но не второй, следовательно,// возможна путаница. Смотрите запись в блоге для дополнительной информации.const returnInt = (element) => parseInt(element, 10);["1", "2", "3"].map(returnInt);// Результатом является массив чисел (как и ожидалось)// Простейший способ добиться вышеозначенного поведения и избежать чувства "чё за!?":["1", "2", "3"].map(Number); // [1, 2, 3]
Спецификации
Specification |
---|
ECMAScript® 2026 Language Specification # sec-array.prototype.map |