Результат рекурсивного вызова сейчас игнорируется. Нужно добавить его элементы в общий результат или передавать один накопитель во все вызовы.
Как рекурсивно развернуть массив без потери элементов
Результат рекурсивного вызова сейчас игнорируется. Нужно добавить его элементы в общий результат или передавать один накопитель во все вызовы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Исправьте функцию:
function flatten(items) {
const out = [];
for (const item of items) {
if (Array.isArray(item)) flatten(item);
else out.push(item);
}
return out;
}
Вход — конечный массив без циклических ссылок.
Ответ
Результат рекурсивного вызова сейчас игнорируется. Нужно добавить его элементы в общий результат или передавать один накопитель во все вызовы.
Вариант с накопителем:
function flatten(items, out = []) {
for (const item of items) {
if (Array.isArray(item)) flatten(item, out);
else out.push(item);
}
return out;
}
Для [1, [2, [], [3]], 4] результат — [1, 2, 3, 4]. Порядок сохраняется. Очень глубокая вложенность может переполнить стек; тогда используйте явный стек обхода.