ООП в JavaScriptИтераторыmedium

Iterable Range

Реализуйте функцию 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]