Šioje pamokoje, naudodamiesi pavyzdžiais, sužinosite apie „JavaScript“ iteratorius ir kartojamas versijas.
„JavaScript Iterables“ ir „Iterators“
„JavaScript“ pateikia protokolą duomenų struktūroms pakartoti. Šis protokolas apibrėžia, kaip šios duomenų struktūros kartojamos naudojant for… of
kilpą.
Protokolo koncepciją galima suskirstyti į:
- pasikartojantis
- iteratorius
„Iterable“ protokole minima, kad iterable turėtų turėti Symbol.iterator
raktą.
„JavaScript Iterables“
Duomenų struktūros, turinčios Symbol.iterator()
metodą, vadinamos iterable. Pavyzdžiui, masyvai, eilutės, rinkiniai ir kt.
„JavaScript Iterators“
Iteratorius yra objektas, kurį grąžina Symbol.iterator()
metodas.
„Iterator“ protokolas pateikia next()
metodą, kaip prieiti prie kiekvieno iteruojamo elemento (duomenų struktūros) po vieną.
Pažvelkime į kartotinių pavyzdžių 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);
Rezultatas
Masyvo iteratorius () StringIterator ()
Čia iškvietus Symbol.iterator()
masyvo ir eilutės metodą, bus grąžinti atitinkami iteratoriai.
Kartoti per pasikartojančius
Galite naudoti for… of
kilpą kartodami šiuos kartojamus objektus. Galite kartoti naudodamiesi tokiu Symbol.iterator()
metodu:
const number = ( 1, 2, 3); for (let n of number(Symbol.iterator)()) ( console.log(n); )
Rezultatas
1 2 3
Arba galite tiesiog pakartoti masyvą taip:
const number = ( 1, 2, 3); for (let n of number) ( console.log(n); )
Čia iteratorius leidžia for… of
kilpai kartoti masyvą ir grąžinti kiekvieną vertę.
„JavaScript next“ () metodas
Iteratoriaus objekte yra next()
metodas, kuris grąžina kitą elementą sekoje.
next()
Metodas yra dvi savybes: value
ir done
.
- vertė savybė gali būti bet kokios duomenų tipas ir yra dabartinės vertę sekoje.
value
- padaryta nuosavybė yra Būlio vertė, kuri rodo, ar iteracijos yra baigtas, ar ne. Jei iteracija yra nebaigta, ypatybė nustatyta kaip „ kita“ .
done
done
false
true
Pažvelkime į masyvo pakartojimų pavyzdį:
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)
Norėdami next()
pakartoti arrIterator
objektą, galite skambinti pakartotinai .
next()
Metodas grąžina su dviem savybių objektą:value
irdone
.- Kai
next()
metodas pasiekia sekos pabaigą, tadadone
savybė nustatoma įfalse
.
Pažvelkime, kaip for… of
ciklas vykdo pirmiau nurodytą programą. Pavyzdžiui,
const arr = ('h', 'e', 'l', 'l', 'o'); for (let i of arr) ( console.log(i); )
Rezultatas
Sveiki
for… of
Kilpa daro lygiai tą patį, kaip nurodyta pirmiau programą.
for… of
Kilpa išlaiko paskambinę next()
metodą ant Iterator. Pasiekus done:true
, for… of
kilpa baigiasi.
Vartotojo apibrėžtas kartotuvas
Taip pat galite sukurti savo iteratorių ir paskambinti, next()
kad pasiektumėte kitą elementą. Pavyzdžiui,
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());
Rezultatas
(reikšmė: "h", padaryta: klaidinga) (reikšmė: "e", padaryta: klaidinga) (reikšmė: "l", padaryta: klaidinga) (reikšmė: "l", padaryta: klaidinga) (reikšmė: "o" , padaryta: klaidinga) (vertė: neapibrėžta, padaryta: tiesa)
Pirmiau pateiktoje programoje mes sukūrėme savo iteratorių. Į displayElements()
funkcija grąžina value
ir done
nuosavybė.
- Kiekvieną kartą, kai
next()
iškviečiamas metodas, funkcija vykdoma vieną kartą ir parodo masyvo vertę. - Galiausiai, kai visi masyvo elementai yra išnaudoti, nustatoma
done
nuosavybėtrue
suvalue
asundefined
.