Сделать плоским произвольно вложенный массив
Реализуйте flatten(arr), возвращающую одноуровневый массив со всеми не-массивными значениями из arr, как бы глубоко они ни были вложены, по порядку. flatten([1, [2, [3, [4]], 5]]) возвращает [1, 2, 3, 4, 5]. Не используйте встроенный Array.prototype.flat(Infinity).
function flatten(arr) {
// ваш код здесь
}
Допишите реализацию.
Пройти массив через reduce; для каждого элемента, если Array.isArray истинно, рекурсивно зайти внутрь и склеить плоский результат, иначе добавить значение. Именно рекурсия достаёт до любой глубины. Пустой массив сводится к [], а порядок элементов сохраняется на всех уровнях.
- ✗Делать плоским только один уровень (голый
concat) и упускать глубже вложенное - ✗Проверять
typeof x === 'object'вместоArray.isArray, путаясь сnullи объектами - ✗Изменять входной массив во время рекурсии вместо построения нового
- →Как сделать плоским только до фиксированной глубины
n, а не до самого дна? - →Почему
Array.isArrayбезопаснее, чемinstanceof Array, между контекстами?
Решение
Свернуть массив через reduce, рекурсивно заходя в каждый вложенный массив.
function flatten(arr) {
return arr.reduce(
(acc, item) =>
Array.isArray(item) ? acc.concat(flatten(item)) : acc.concat(item),
[]
);
}
Как это работает
reduce накапливает плоский результат в acc. Для каждого элемента проверяем Array.isArray: если это массив, рекурсивно делаем его плоским и склеиваем результат; иначе просто добавляем значение. Рекурсия достаёт значения с любой глубины, а порядок сохраняется, потому что элементы обрабатываются слева направо.
Пустой массив сразу сводится к стартовому []. Новый массив строится с нуля, вход не изменяется.