Функция развёртывания вложенного массива без Array.flat()

Используйте явный стек кадров обхода вместо рекурсии: он не переполнит стек вызовов на тысяче уровней. Объекты и прочие значения сохраняйте как элементы.

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

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

Используйте явный стек кадров обхода вместо рекурсии: он не переполнит стек вызовов на тысяче уровней. Объекты и прочие значения сохраняйте как элементы.

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

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

Условие

Создайте функцию, которая разворачивает (выравнивает) вложенный массив, не прибегая к методу Array.flat(). Учтите, что глубина вложенности может достигать 1000 уровней.

Пример вызова:

function flattenArray(arr) {
    // реализация
}

Функция должна принимать один параметр — массив любой степени вложенности, и возвращать новый массив, содержащий все элементы в плоском виде.

Ограничения:

  • Запрещено использовать встроенный Array.flat() и аналогичные методы.
  • Максимальная глубина вложения может быть до 1000.
  • Решение должно работать корректно для массивов, содержащих любые типы данных, включая другие массивы, объекты, числа, строки и т.д.

Ответ

Используйте явный стек кадров обхода вместо рекурсии: он не переполнит стек вызовов на тысяче уровней. Объекты и прочие значения сохраняйте как элементы.

function flattenArray(arr) {
  const result = [];
  const stack = [{ array: arr, index: 0 }];
  const active = new Set([arr]);
  while (stack.length) {
    const frame = stack[stack.length - 1];
    if (frame.index >= frame.array.length) {
      active.delete(frame.array); stack.pop(); continue;
    }
    const index = frame.index++;
    if (!(index in frame.array)) continue;
    const value = frame.array[index];
    if (Array.isArray(value)) {
      if (active.has(value)) throw new TypeError('Циклический массив');
      active.add(value);
      stack.push({ array: value, index: 0 });
    } else result.push(value);
  }
  return result;
}

Порядок сохраняется, пропуски игнорируются. active хранит только текущую ветку: повтор одного массива в разных ветках допустим, настоящий цикл отвергается. Время линейно по развёрнутому обходу, дополнительная память O(глубина) без результата.

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

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

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

Подробнее