Итераторы
Объект является итератором, если он умеет обращаться к элементам коллекции по одному за раз, при этом отслеживая свое текущее положение внутри этой последовательности.
Итератор
В JavaScript итератор - это объект, который предоставляет метод next()
, возвращающий следующий элемент последовательности. Этот метод возвращает объект с двумя свойствами: done
и value
.
После создания, объект-итератор может быть явно использован, с помощью вызовов метода next()
.
Зачем нужен Iterator ?
Когда хочешь перебирать объекты и другие типы данных по своему, итератор это отличный вариант.
1function createArrayIterator(array) {2 let nextIndex = 0;3 return {4 next: function() {5 return nextIndex < array.length6 ? { value: array[nextIndex++], done: false }7 : { done: true };8 }9 };10}1112const iterator = createArrayIterator([1, 2, 3]);13console.log(iterator.next().value); // 114console.log(iterator.next().value); // 215console.log(iterator.next().value); // 316console.log(iterator.next().done); // true
Объект является итерируемым, если в нем определен способ перебора значений, то есть, например, как значения перебираются в конструкции for..of
.
Некоторые встроенные типы, такие как Array
или Map
, по умолчанию являются итерируемыми, в то время как другие типы, как, например, Object
, таковыми не являются.
Чтобы быть итерируемым, объект обязан реализовать метод @@iterator
, что означает, что он (или один из объектов выше по цепочке прототипов) обязан иметь свойство с именем Symbol.iterator
1class RangeIterator {2 constructor(start, stop) {3 this.value = start;4 this.stop = stop;5 }67 [Symbol.iterator]() { return this; }89 next() {10 let value = this.value;11 if (value < this.stop) {12 this.value++;13 return {done: false, value: value};14 } else {15 return {done: true, value: undefined};16 }17 }18}1920// Возвращает новый итератор, который считает от 'start' до 'stop'.21function range(start, stop) {22 return new RangeIterator(start, stop);23}
Практика 👨💻👨💻
Создать класс CalendarIterator
Приватные поля:
- months
- start
- end
Публичные поля
- next
- toString
1class CalendarIterator{}23const calendar = new CalendarIterator(1, 2);45console.log(calendar.next().value); // January6console.log(calendar.next().value); // February7console.log(calendar.next().done); // true8console.log(calendar.toString()) // January,February