Используйте явный стек кадров с массивом и текущим индексом. Это сохраняет порядок и не переполняет стек вызовов на глубокой вложенности; flat и рекурсивные вызовы не нужны.
Создание собственного метода flatten
Используйте явный стек кадров с массивом и текущим индексом. Это сохраняет порядок и не переполняет стек вызовов на глубокой вложенности; flat и рекурсивные вызовы не нужны.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработайте свою версию функции flatten, которая преобразует вложенные массивы в плоскую структуру. При этом необходимо реализовать алгоритм без использования готовых методов языка, полагаясь только на базовые конструкции и рекурсию/итерацию. Пример входных данных и ожидаемого результата:
const nested = [1, [2, [3, 4], 5], 6];
// ваш метод flatten(nested) должен вернуть [1, 2, 3, 4, 5, 6]
Требования:
- Функция должна корректно обрабатывать массивы любой глубины вложенности.
- Не использовать встроенный Array.prototype.flat или аналогичные готовые решения.
- Сохранить порядок элементов как в оригинальном массиве.
- Обеспечить работу как с пустыми массивами, так и с массивами, содержащими различные типы данных (числа, строки, объекты и т.д.).
Ответ
Используйте явный стек кадров с массивом и текущим индексом. Это сохраняет порядок и не переполняет стек вызовов на глубокой вложенности; flat и рекурсивные вызовы не нужны.
function flatten(input) {
const result = [], stack = [{ array: input, index: 0 }];
while (stack.length) {
const frame = stack[stack.length - 1];
if (frame.index >= frame.array.length) { stack.length--; continue; }
const index = frame.index++;
if (!(index in frame.array)) continue;
const value = frame.array[index];
if (Array.isArray(value)) stack[stack.length] = { array: value, index: 0 };
else result[result.length] = value;
}
return result;
}
Array.isArray используется только для проверки типа; для разворачивания нет готовых методов и даже push/pop. Пустые позиции пропускаются, явный undefined сохраняется, обычные объекты остаются по ссылке. Контракт — конечная структура без циклов; «любая глубина» ограничена доступной памятью.