Iterátory a iterátory JavaScriptu

V tomto kurzu se na příkladech dozvíte o iterátorech a iterátorech JavaScriptu.

Iterable a JavaScript iterátory

JavaScript poskytuje protokol pro iteraci přes datové struktury. Tento protokol definuje, jak jsou tyto datové struktury iterovány pomocí for… ofsmyčky.

Koncept protokolu lze rozdělit na:

  • iterovatelný
  • iterátor

V iterovatelném protokolu se uvádí, že iterovatelný klíč by měl mít Symbol.iteratorklíč.

Iterable JavaScriptu

Datové struktury, které mají Symbol.iterator()metodu, se nazývají iterovatelné. Například pole, řetězce, sady atd.

Iterátory JavaScriptu

Iterátor je objekt, který je vrácen Symbol.iterator()metodou.

Protokol iterátoru poskytuje next()metodu pro přístup ke každému prvku iterovatelné (datové struktuře) jeden po druhém.

Podívejme se na příklad, který má iterable 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);

Výstup

 Array Iterator () StringIterator ()

Tady volání Symbol.iterator()metody pole i řetězce vrátí jejich příslušné iterátory.

Iterovat skrz Iterables

for… ofSmyčku můžete použít k iteraci těmito iterovatelnými objekty. Symbol.iterator()Metodu můžete iterovat takto:

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

Výstup

 1 2 3

Nebo můžete jednoduše iterovat prostřednictvím pole takto:

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

Zde iterátor umožňuje for… ofsmyčce iterovat přes pole a vrátit každou hodnotu.

Metoda JavaScript next ()

Objekt iterátoru má next()metodu, která vrací další položku v pořadí.

next()Způsob obsahuje dvě vlastnosti: valuea done.

  • Hodnota vlastnost může být jakéhokoliv typu dat a představuje aktuální hodnotu v sekvenci.
    value
  • provedeno vlastnost je logická hodnota, která označuje, zda je iterace dokončena či nikoli. Pokud je iterace neúplná, vlastnost je nastavena na , jinak je nastavena na .
    donedonefalsetrue

Podívejme se na příklad iterable pole:

 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)

Můžete next()opakovaně volat k iteraci arrIteratorobjektu.

  • next()Metoda vrátí objekt se dvěma vlastnostmi: valuea done.
  • Když next()metoda dosáhne konce sekvence, pak je donevlastnost nastavena na false.

Podívejme se na to, jak for… ofsmyčka provádí výše uvedený program. Například,

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

Výstup

 Ahoj

for… ofSmyčka dělá přesně stejný jako v případě programu výše.

for… ofSmyčky udržuje volání next()metody na iterátoru. Jakmile dosáhne done:true, for… ofsmyčka se ukončí.

Uživatelem definovaný iterátor

Můžete také vytvořit vlastní iterátor a zavolat next()pro přístup k dalšímu prvku. Například,

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

Výstup

 (hodnota: "h", hotovo: false) (hodnota: "e", hotovo: false) (hodnota: "l", hotovo: false) (hodnota: "l", hotovo: false) (hodnota: "o" , done: false) (hodnota: undefined, done: true)

Ve výše uvedeném programu jsme vytvořili vlastní iterátor. Tyto displayElements()funkce vrátí valuea donenemovitost.

  • Při každém next()volání metody se funkce provede jednou a zobrazí hodnotu pole.
  • Nakonec, když jsou vyčerpány všechny prvky pole, je donevlastnost nastavena na true, s valueas undefined.

Zajímavé články...