У цьому підручнику ви дізнаєтеся про ітератори та ітератори JavaScript за допомогою прикладів.
Ітератори та ітератори JavaScript
JavaScript надає протокол для ітерації структур даних. Цей протокол визначає спосіб ітерації цих структур даних за допомогою for… of
циклу.
Поняття протоколу можна розділити на:
- ітерабельний
- ітератор
Ітерабельний протокол зазначає, що ітеративний повинен мати Symbol.iterator
ключ.
JavaScript Iterables
Структури даних, що мають 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());
Вихідні дані
(value: "h", done: false) (value: "e", done: false) (value: "l", done: false) (value: "l", done: false) (value: "o" , done: false) (значення: undefined, done: true)
У вищезазначеній програмі ми створили власний ітератор. У displayElements()
функції повертає value
і done
властивість.
- Кожного разу, коли
next()
метод викликається, функція виконується один раз і відображає значення масиву. - Нарешті, коли всі елементи масиву будуть вичерпані, то
done
властивість має значенняtrue
, з ,value
якundefined
.