Пусть нам дан класс AA
(Async Array), у которого всего один метод read
, возвращающий промис с массивом значений, среди которых могут быть опять экземляры класса AA
или числа.
class AA { #array; constructor(...array) { this.#array = array; } read() { return new Promise(resolve => { setTimeout(() => resolve(this.#array), 100); }); } }
Функция flatten
принимает экземляр класса AA
и возвращает промис с массивом всех чисел, со всех уровней.
Не бойтесь, в этой задаче функцию flatten
реализовывать не нужно, она уже написана. Проблема в том, что она работает слишком медленно. Например, для массива example
она работает 1000 мс, хотя могла бы работать быстрее.
const example = new AA( new AA(1, new AA(new AA(2)), new AA(3)), new AA(4, new AA(5, 6), 7), 8, new AA(9, new AA(10, new AA(11, 12), 13)), ) async function flatten(value) { const result = []; for (const element of await value.read()) { if (element instanceof AA) { result.push(...await flatten(element)); } else { result.push(element); } } return result; } console.time("aa") flatten(example).then((result) => { console.log(result); // [1,2,3,4,5,6,7,8,9,10,11,12,13] console.timeEnd("aa"); // ≈ 1000 ms });
Перепишите функцию flatten
, чтобы она работала быстрее. Для значения example
функция может вернуть правильный ответ примерно за 400 мс.