Learn JavaScript

flat() - метод для разворачивания вложенных массивов в JavaScript

flat() разворачивает вложенные массивы в более плоский массив.

Этот метод полезен, когда внутри массива есть другие массивы и их нужно “расплющить”.

Синтаксис

array.flat()
array.flat(depth)

depth - это глубина разворачивания.

Если её не передать, используется значение 1.

Что делает flat()

Метод проходит по массиву и раскрывает вложенные массивы на указанную глубину.

const result = [1, 2, [3, 4]].flat();

console.log(result); // [1, 2, 3, 4]

По умолчанию только один уровень

Без аргументов flat() разворачивает массив только на один уровень.

const result = [1, [2, [3, 4]]].flat();

console.log(result); // [1, 2, [3, 4]]

Внутренний массив [3, 4] остался вложенным, потому что глубина по умолчанию равна 1.

Глубина разворачивания

Если нужно раскрыть массив глубже, можно передать число:

const result = [1, [2, [3, 4]]].flat(2);

console.log(result); // [1, 2, 3, 4]

Чем больше depth, тем глубже метод будет раскрывать вложенность.

Полное разворачивание

Если нужно развернуть массив до конца, иногда используют Infinity.

const result = [1, [2, [3, [4]]]].flat(Infinity);

console.log(result); // [1, 2, 3, 4]

Это удобно, когда заранее неизвестно, насколько глубоко вложены массивы.

Что возвращает flat()

flat() возвращает новый массив.

const numbers = [1, [2, 3]];
const result = numbers.flat();

console.log(result);  // [1, 2, 3]
console.log(numbers); // [1, [2, 3]]

Это важно: исходный массив не меняется.

flat() не меняет исходный массив

Метод создаёт новый массив и не работает “на месте”.

const items = [1, [2, 3]];
const flatItems = items.flat();

console.log(items);     // [1, [2, 3]]
console.log(flatItems); // [1, 2, 3]

Пустые слоты

flat() убирает пустые слоты на тех уровнях, которые разворачивает.

const arr = [1, , 3, [4, , 6]];

console.log(arr.flat()); // [1, 3, 4, 6]

Это может быть неожиданно, если в массиве есть “дырки”.

flat() и concat()

Иногда кажется, что flat() и concat() делают похожие вещи, но задача у них разная.

const result = [[1, 2], [3, 4]].flat();

console.log(result); // [1, 2, 3, 4]

flat() раскрывает уже вложенные массивы.

concat() объединяет массивы, которые вы ему передаёте.

flat() и flatMap()

flatMap() сначала применяет map(), а потом разворачивает результат на один уровень.

const result = [1, 2, 3].flatMap((value) => [value, value * 10]);

console.log(result); // [1, 10, 2, 20, 3, 30]

Если преобразование не нужно, а нужно только раскрыть вложенность, чаще используют именно flat().

Когда это полезно

flat() удобно использовать, когда:

  • в массиве лежат вложенные массивы
  • нужно получить более плоскую структуру
  • важно не менять исходные данные

Пример:

const pages = [["Главная", "Каталог"], ["Контакты"]];
const menu = pages.flat();

console.log(menu); // ["Главная", "Каталог", "Контакты"]

Частые ошибки

Думать, что flat() разворачивает всё полностью

const arr = [1, [2, [3]]];

console.log(arr.flat()); // [1, 2, [3]]

По умолчанию раскрывается только один уровень.

Думать, что flat() меняет исходный массив

const arr = [1, [2, 3]];

arr.flat();

console.log(arr); // [1, [2, 3]]

Если результат не сохранить, исходный массив останется прежним.

Путать flat() и flatMap()

const arr = [[1], [2], [3]];

console.log(arr.flat()); // [1, 2, 3]

flat() только разворачивает массив. Для преобразования элементов нужен flatMap() или отдельный map().

Быстрая памятка

  • flat() разворачивает вложенные массивы
  • по умолчанию метод работает только на глубину 1
  • можно передать depth, включая Infinity
  • flat() возвращает новый массив
  • исходный массив не меняется

Коротко

flat() - это удобный способ сделать массив более плоским. Главное, что стоит запомнить: по умолчанию метод раскрывает только один уровень вложенности и возвращает новый массив, не меняя исходный.