Array.prototype.flatMap()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.

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

Синтаксис

var new_array = arr.flatMap(function callback(currentValue[, index[, array]]) {
    // возвращает элемент для new_array
}[, thisArg])

Параметры

callback

Функция которая производит элементы нового массива, принимает три аргумента:

currentValue

Текущий обрабатываемый элемент массива.

indexНеобязательный

Индекс обрабатываемого элемента в массиве.

arrayНеобязательный

Массив по которому осуществляется обход.

thisArgНеобязательный

Значение используемое в качестве this при вызове функции callback.

Возвращаемое значение

Новый массив, каждый элемент которого является результатом выполнения функции callback и "поднят" на уровень 1.

Описание

Смотрите Array.prototype.map() для детального описания callback функции. Метод flatMap идентичен методу map с последующим вызовом flat с параметром depth 1.

Примеры

map и flatMap

js
let arr1 = [1, 2, 3, 4];

arr1.map((x) => [x * 2]);
// [[2], [4], [6], [8]]

arr1.flatMap((x) => [x * 2]);
// [2, 4, 6, 8]

// выравнивается только один уровень
arr1.flatMap((x) => [[x * 2]]);
// [[2], [4], [6], [8]]

Хотя результат полученный в примере выше можно было получить используя просто map, ниже мы рассмотрим пример где flatMap является более эффективным.

Давайте сгенерируем список слов из списка предложений.

js
let arr1 = ["it's Sunny in", "", "California"];

arr1.map((x) => x.split(" "));
// [["it's","Sunny","in"],[""],["California"]]

arr1.flatMap((x) => x.split(" "));
// ["it's","Sunny","in", "", "California"]

Обратите внимание, длина списка вывода может отличаться от длины списка ввода.

//=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

Альтернативное решение

reduce and concat

js
var arr1 = [1, 2, 3, 4];
arr1.flatMap((x) => [x * 2]);
// is equivalent to
arr1.reduce((acc, x) => acc.concat([x * 2]), []);
// [2, 4, 6, 8]

//=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

Спецификации

Specification
ECMAScript® 2025 Language Specification
# sec-array.prototype.flatmap

Совместимость с браузерами

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
flatMap

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

См так же