Šajā apmācībā jūs uzzināsit par JavaScript iteratoriem un iterables ar piemēru palīdzību.
JavaScript atkārtojamie un atkārtojamie
JavaScript nodrošina protokolu, lai atkārtotu datu struktūras. Šis protokols nosaka, kā šīs datu struktūras tiek atkārtotas, izmantojot for… of
cilpu.
Protokola jēdzienu var sadalīt:
- atkārtojams
- atkārtotājs
Atkārtojamā protokolā ir minēts, ka iterējamai jābūt Symbol.iterator
atslēgai.
JavaScript Iterables
Datu struktūras, kurām ir Symbol.iterator()
metode, sauc par atkārtojamām. Piemēram, masīvi, virknes, kopas utt.
JavaScript atkārtotāji
Iterators ir objekts, kuru atgriež Symbol.iterator()
metode.
Iteratora protokols nodrošina next()
metodi, kā piekļūt katram iterējamā elementa (datu struktūras) elementam pa vienam.
Apskatīsim piemēru ar atkārtojamām versijām 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);
Rezultāts
Masīva Iterator () StringIterator ()
Šeit, izsaucot Symbol.iterator()
gan masīva, gan virknes metodi, tiek atgriezti attiecīgie iteratori.
Iterēt caur Iterables
Jūs varat izmantot for… of
cilpu, lai atkārtotu šos atkārtojamos objektus. Jūs varat atkārtot, izmantojot šādu Symbol.iterator()
metodi:
const number = ( 1, 2, 3); for (let n of number(Symbol.iterator)()) ( console.log(n); )
Rezultāts
1 2 3
Vai arī varat vienkārši atkārtot masīvu šādi:
const number = ( 1, 2, 3); for (let n of number) ( console.log(n); )
Šeit iterators ļauj for… of
cilpai atkārtot masīvu un atgriezt katru vērtību.
JavaScript nākamā () metode
Iteratora objektam ir next()
metode, kas atgriež nākamo vienumu secībā.
next()
Metode satur divas īpašības: value
un done
.
- vērtību Īpašums var būt jebkura datu tipa un atspoguļo pašreizējo vērtību secību.
value
- darīts īpašums ir Būla vērtība, kas norāda, vai atkārtojuma ir pilnīgs vai nav. Ja atkārtojums nav pilnīgs, rekvizīts tiek iestatīts uz , citādi tas ir iestatīts uz .
done
done
false
true
Apskatīsim masīvu atkārtojamo piemēru:
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)
Varat next()
atkārtoti zvanīt, lai atkārtotu arrIterator
objektu.
next()
Metode atgriež objektu ar divām īpašībām:value
undone
.- Kad
next()
metode sasniedz secības beigas,done
rekvizīts tiek iestatīts uzfalse
.
Apskatīsim, kā for… of
cikls izpilda iepriekš minēto programmu. Piemēram,
const arr = ('h', 'e', 'l', 'l', 'o'); for (let i of arr) ( console.log(i); )
Rezultāts
Sveiki
for… of
Cilpa nav tieši tāds pats kā programmas augstāk.
for… of
Cilpa saglabā zvanot next()
metodi uz iterator. Kad tas sasniedz done:true
, for… of
cilpa beidzas.
Lietotāja definēts atkārtotājs
Varat arī izveidot savu iteratoru un piezvanīt, next()
lai piekļūtu nākamajam elementam. Piemēram,
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());
Rezultāts
(vērtība: "h", izdarīts: nepatiesa) (vērtība: "e", izdarīts: nepatiesa) (vērtība: "l", izdarīts: nepatiesa) (vērtība: "l", izdarīts: nepatiesa) (vērtība: "o" (darīts: nepatiesi) (vērtība: nedefinēts, izdarīts: patiess)
Iepriekš minētajā programmā mēs esam izveidojuši savu iteratoru. Par displayElements()
funkciju atgriežas value
un done
īpašumu.
- Katru reizi, kad
next()
tiek izsaukta metode, funkcija tiek izpildīta vienu reizi un parāda masīva vērtību. - Visbeidzot, kad visi masīva elementi ir izsmelti,
done
īpašums tiek iestatīts uztrue
, arvalue
asundefined
.