--- title: Array.prototype.flatMap() slug: Web/JavaScript/Reference/Global_Objects/Array/flatMap translation_of: Web/JavaScript/Reference/Global_Objects/Array/flatMap ---
{{JSRef}}

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

Синтаксис

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

Параметры

callback
Функция которая производит элементы нового массива, принимает три аргумента:
currentValue
Текущий обрабатываемый элемент массива.
index{{optional_inline}}
Индекс обрабатываемого элемента в массиве.
array{{optional_inline}}
Массив по которому осуществляется обход.
thisArg{{optional_inline}}
Значение используемое в качестве this при вызове функции callback.

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

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

Описание

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

Примеры

map и flatMap

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 является более эффективным.

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

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

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]

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

Спецификация Статус Комментарий
{{SpecName('ES6', '#sec-array.prototype.flatmap', 'Array.prototype.flatMap')}} {{Spec2('ES6')}}

Поддержка браузерами

{{Compat("javascript.builtins.Array.flatMap")}}

См так же: