Вложенный массив можно развернуть обходом в глубину, сохраняя порядок и добавляя в результат только не-массивы.
// [1, 2, 3, [4, [5]]] => [1, 2, 3, 4, 5]
Вложенный массив можно развернуть обходом в глубину, сохраняя порядок и добавляя в результат только не-массивы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// [1, 2, 3, [4, [5]]] => [1, 2, 3, 4, 5]
function
Ответ
Вложенный массив можно развернуть обходом в глубину, сохраняя порядок и добавляя в результат только не-массивы.
Итеративный вариант для конечных ациклических массивов не расходует стек вызовов на вложенность:
function flatten(array) {
const result = [];
const stack = [array[Symbol.iterator]()];
while (stack.length) {
const item = stack[stack.length - 1].next();
if (item.done) stack.pop();
else if (Array.isArray(item.value)) stack.push(item.value[Symbol.iterator]());
else result.push(item.value);
}
return result;
}
Для примера получится [1, 2, 3, 4, 5]. Здесь пустые позиции дают undefined; нативный flat(Infinity) пропускает их.