Реализуйте функцию range, возвращающую iterable объект, генерирующий значения из промежутка.
range(end)
— генерирует значения от 0
(включительно) до end
(не включительно)range(start, end)
— генерирует значения от start
(включительно) до end
(не включительно)range(start, end, step)
— генерирует значения от start
(включительно) до end
(не включительно) с шагом step
.Благодаря этому мы сможем использовать цикл for-of для перебора значений:
for(const x of range(5, 10)) { console.log(x); // 5, 6, 7, 8, 9 }
Или даже использовать итераторы:
const isPrime = n => Iterator.from(range(1, n + 1)) .filter(x => n % x === 0) .reduce(a => a + 1, 0) === 2; const firstTenPrimeNumbers = Iterator.from(range(0, Infinity)) .filter(isPrime) .take(10) .toArray();
Поведение взято прямиком из документации языка Python.
Array.from(range(0)) // [] Array.from(range(10)) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Array.from(range(1, 11)) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Array.from(range(3, 0)) // [] Array.from(range(0, 30, 5)) // [0, 5, 10, 15, 20, 25] Array.from(range(0, 10, 3)) // [0, 3, 6, 9] Array.from(range(0, -4, -1)) // [0, -1, -2, -3] Array.from(range(-10, 5, 3)) // []
Объект можно переиспользовать:
const r = range(4); console.log([...r]); // [0,1,2,3] console.log([...r]); // [0,1,2,3]