В этом руководстве вы узнаете об итераторах и итераторах 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
- сделано свойство является логическое значение, указывающее , является ли итерация завершена или нет. Если итерация не завершена, свойство устанавливается на , в противном случае - на .
done
done
false
true
Давайте посмотрим на пример итерации массива:
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
.