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… of
smyč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.iterator
klíč.
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… of
Smyč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… of
smyč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: value
a 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 .
done
done
false
true
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 arrIterator
objektu.
next()
Metoda vrátí objekt se dvěma vlastnostmi:value
adone
.- Když
next()
metoda dosáhne konce sekvence, pak jedone
vlastnost nastavena nafalse
.
Podívejme se na to, jak for… of
smyč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… of
Smyčka dělá přesně stejný jako v případě programu výše.
for… of
Smyčky udržuje volání next()
metody na iterátoru. Jakmile dosáhne done:true
, for… of
smyč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í value
a done
nemovitost.
- 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
done
vlastnost nastavena natrue
, svalue
asundefined
.