`Array.prototype.flat` и `Array.prototype.flatMap`
Array.prototype.flat
Массив в этом примере имеет несколько уровней вложенности: он содержит массив, который, в свою очередь, содержит другой массив.
const array = [1, [2, [3]]];
// ^^^^^^^^^^^^^ внешний массив
// ^^^^^^^^ вложенный массив
// ^^^ самый глубокий массив
Array#flat
возвращает одномерную версию многомерного массива.
array.flat();
// → [1, 2, [3]]
// …эквивалентно:
array.flat(1);
// → [1, 2, [3]]
Глубина по умолчанию равна 1
, но можно указать любое число для рекурсивного свёртывания до этой глубины. Чтобы продолжать свёртывание рекурсивно, пока в результате не останется вложенных массивов, нужно передать Infinity
.
// Рекурсивное свёртывание до полного удаления вложенных массивов:
array.flat(Infinity);
// → [1, 2, 3]
Почему этот метод называется Array.prototype.flat
, а не Array.prototype.flatten
? Прочтите наш разбор #SmooshGate, чтобы узнать!
Array.prototype.flatMap
Вот ещё один пример. У нас есть функция duplicate
, которая принимает значение и возвращает массив, содержащий это значение дважды. Если применить duplicate
к каждому значению массива, получится вложенный массив.
const duplicate = (x) => [x, x];
[2, 3, 4].map(duplicate);
// → [[2, 2], [3, 3], [4, 4]]
Затем можно вызвать flat
для результата, чтобы свести массив:
[2, 3, 4].map(duplicate).flat(); // 🐌
// → [2, 2, 3, 3, 4, 4]
Поскольку этот шаблон очень распространён в функциональном программировании, для него теперь существует специальный метод flatMap
.
[2, 3, 4].flatMap(duplicate); // 🚀
// → [2, 2, 3, 3, 4, 4]
flatMap
немного эффективнее, чем выполнение map
, за которым следует flat
по отдельности.
Интересуетесь вариантами использования flatMap
? Ознакомьтесь с объяснением Акселя Раушмайера.