Проверяет умение реализовать рекурсивный обход вложенных структур и понимание работы стека вызовов при работе с массивами произвольной глубины.
Задача сводится к обходу дерева, где узлами являются массивы, а листьями — значения. Поскольку глубина заранее неизвестна, естественным решением будет рекурсия: для каждого элемента проверяем, является ли он массивом, и если да — рекурсивно обрабатываем его, иначе добавляем в результат.
Метод reduce позволяет компактно накапливать результат, а рекурсия обрабатывает вложенность.
function flatten(arr) {
return arr.reduce((acc, item) => {
if (Array.isArray(item)) {
return acc.concat(flatten(item));
}
return acc.concat(item);
}, []);
}
console.log(flatten([1, [2, [3, [4]], 5]])); // [1, 2, 3, 4, 5]Рекурсия может привести к переполнению стека на очень глубоких массивах. Альтернатива — использовать явный стек, что делает решение устойчивым к большим данным.
function flattenStack(arr) {
const stack = [...arr];
const result = [];
while (stack.length) {
const item = stack.pop();
if (Array.isArray(item)) {
stack.push(...item);
} else {
result.push(item);
}
}
return result.reverse();
}Итог: рекурсивный вариант проще и читаемее, но для потенциально глубоких структур лучше использовать итеративный подход со стеком, чтобы избежать переполнения стека вызовов.