JavaScript итератори и Iterables

В този урок ще научите за итераторите на JavaScript и итерациите с помощта на примери.

JavaScript Iterables и итератори

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);

Изход

 Array Iterator () StringIterator ()

Тук извикването на Symbol.iterator()метода на масива и низа връща съответните им итератори.

Итерация чрез Iterables

Можете да използвате 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", готово: false) (стойност: "e", готово: false) (стойност: "l", готово: false) (стойност: "l", готово: false) (стойност: "o" , done: false) (стойност: undefined, done: true)

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

  • Всеки път, когато next()методът бъде извикан, функцията се изпълнява веднъж и показва стойността на масив.
  • И накрая, когато всички елементи на масив са изчерпани, doneсвойството се задава на true, като valueas undefined.

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