HTML / CSSJavaScriptNode jsПаттерны проектированияПрактические

Итераторы

Объект является итератором, если он умеет обращаться к элементам коллекции по одному за раз, при этом отслеживая свое текущее положение внутри этой последовательности.

:pencil:Итератор

В JavaScript итератор - это объект, который предоставляет метод next(), возвращающий следующий элемент последовательности. Этот метод возвращает объект с двумя свойствами: done и value.

После создания, объект-итератор может быть явно использован, с помощью вызовов метода next().

Зачем нужен Iterator ?

Когда хочешь перебирать объекты и другие типы данных по своему, итератор это отличный вариант.

1function createArrayIterator(array) {
2 let nextIndex = 0;
3 return {
4 next: function() {
5 return nextIndex < array.length
6 ? { value: array[nextIndex++], done: false }
7 : { done: true };
8 }
9 };
10}
11
12const iterator = createArrayIterator([1, 2, 3]);
13console.log(iterator.next().value); // 1
14console.log(iterator.next().value); // 2
15console.log(iterator.next().value); // 3
16console.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 }
6
7 [Symbol.iterator]() { return this; }
8
9 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}
19
20// Возвращает новый итератор, который считает от 'start' до 'stop'.
21function range(start, stop) {
22 return new RangeIterator(start, stop);
23}

Практика 👨‍💻👨‍💻

Создать класс CalendarIterator

Приватные поля:

  • months
  • start
  • end

Публичные поля

  • next
  • toString
1class CalendarIterator{}
2
3const calendar = new CalendarIterator(1, 2);
4
5console.log(calendar.next().value); // January
6console.log(calendar.next().value); // February
7console.log(calendar.next().done); // true
8console.log(calendar.toString()) // January,February
Hello