Итераторы и итераторы JavaScript

В этом руководстве вы узнаете об итераторах и итераторах JavaScript с помощью примеров.

Итерации и итераторы JavaScript

JavaScript предоставляет протокол для перебора структур данных. Этот протокол определяет, как эти структуры данных перебираются с помощью for… ofцикла.

Концепцию протокола можно разделить на:

  • повторяемый
  • итератор

Протокол итерации упоминает, что итерация должна иметь Symbol.iteratorключ.

Итерируемые объекты JavaScript

Структуры данных, в которых есть Symbol.iterator()метод, называются итерируемыми. Например, массивы, строки, множества и т. Д.

Итераторы JavaScript

Итератор - это объект, возвращаемый Symbol.iterator()методом.

Протокол итератора предоставляет next()метод для доступа к каждому элементу итерации (структуры данных) по одному.

Давайте посмотрим на пример итераций, имеющих Symbol.Iterator()

 const arr = (1, 2 ,3); // calling the Symbol.iterator() method const arrIterator = arr(Symbol.iterator)(); // gives Array Iterator console.log(arrIterator); const str = 'hello'; // calling the Symbol.iterator() method const strIterator = str(Symbol.iterator)(); // gives String Iterator console.log(strIterator);

Вывод

 Итератор массива () StringIterator ()

Здесь вызов Symbol.iterator()метода как массива, так и строки возвращает их соответствующие итераторы.

Итерировать по итерациям

Вы можете использовать for… ofцикл для перебора этих повторяемых объектов. Вы можете повторить этот Symbol.iterator()метод следующим образом:

 const number = ( 1, 2, 3); for (let n of number(Symbol.iterator)()) ( console.log(n); )

Вывод

 1 2 3

Или вы можете просто перебирать массив следующим образом:

 const number = ( 1, 2, 3); for (let n of number) ( console.log(n); )

Здесь итератор позволяет for… ofциклу перебирать массив и возвращать каждое значение.

Метод JavaScript next ()

У объекта итератора есть next()метод, который возвращает следующий элемент в последовательности.

next()Метод содержит два свойства: valueа done.

  • Значение свойство может быть любого типа данных и представляет собой текущее значение в последовательности.
    value
  • сделано свойство является логическое значение, указывающее , является ли итерация завершена или нет. Если итерация не завершена, свойство устанавливается на , в противном случае - на .
    donedonefalsetrue

Давайте посмотрим на пример итерации массива:

 const arr = ('h', 'e', 'l', 'l', 'o'); let arrIterator = arr(Symbol.iterator)(); console.log(arrIterator.next()); // (value: "h", done: false) console.log(arrIterator.next()); // (value: "e", done: false) console.log(arrIterator.next()); // (value: "l", done: false) console.log(arrIterator.next()); // (value: "l", done: false) console.log(arrIterator.next()); // (value: "o", done: false) console.log(arrIterator.next()); // (value: undefined, done: true)

Вы можете вызывать next()несколько раз, чтобы перебирать arrIteratorобъект.

  • next()Метод возвращает объект с двумя свойствами: valueа done.
  • Когда next()метод достигает конца последовательности, doneсвойство устанавливается в false.

Давайте посмотрим, как for… ofцикл выполняет указанную выше программу. Например,

 const arr = ('h', 'e', 'l', 'l', 'o'); for (let i of arr) ( console.log(i); )

Вывод

 Здравствуйте

for… ofЦикл делает точно так же , как программа выше.

for… ofПетля удерживает вызов next()метода итератора. Как только он достигнет done:true, for… ofцикл завершится.

Итератор, определяемый пользователем

Вы также можете создать свой собственный итератор и вызвать его next()для доступа к следующему элементу. Например,

 function displayElements(arr) ( // to update the iteration let n = 0; return ( // implementing the next() function next() ( if(n < arr.length) ( return ( value: arr(n++), done: false ) ) return ( value: undefined, done: true ) ) ) ) const arr = ('h', 'e', 'l', 'l', 'o'); const arrIterator = displayElements(arr); console.log(arrIterator.next()); console.log(arrIterator.next()); console.log(arrIterator.next()); console.log(arrIterator.next()); console.log(arrIterator.next()); console.log(arrIterator.next());

Вывод

 (значение: «h», готово: ложь) (значение: «е», готово: ложь) (значение: «l», готово: ложь) (значение: «l», готово: ложь) (значение: «o» , сделано: false) (значение: undefined, done: true)

В приведенной выше программе мы создали собственный итератор. В displayElements()функции возвращает valueи doneсвойство.

  • Каждый раз при next()вызове метода функция выполняется один раз и отображает значение массива.
  • Наконец, когда все элементы массива будут исчерпаны, то doneсвойство имеет значение true, с , valueкак undefined.

Интересные статьи...