Используйте явный стек кадров обхода вместо рекурсии: он не переполнит стек вызовов на тысяче уровней. Объекты и прочие значения сохраняйте как элементы.
Функция развёртывания вложенного массива без 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(глубина) без результата.