Как рекурсивно развернуть массив без потери элементов

Результат рекурсивного вызова сейчас игнорируется. Нужно добавить его элементы в общий результат или передавать один накопитель во все вызовы.

Короткий ответ

Что ответить на собеседовании

Результат рекурсивного вызова сейчас игнорируется. Нужно добавить его элементы в общий результат или передавать один накопитель во все вызовы.

Подробный разбор

Ответ с пояснениями

Условие

Исправьте функцию:

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]. Порядок сохраняется. Очень глубокая вложенность может переполнить стек; тогда используйте явный стек обхода.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее