Iterowalne JavaScript
Obiekty iterowalne to obiekty, po których można iterować za pomocą programu for..of
.
Technicznie rzecz biorąc, iterable muszą implementować tę Symbol.iterator
metodę.
Iteracja nad ciągiem
Możesz użyć for..of
pętli do iteracji po elementach ciągu:
Przykład
for (const x of "W3Schools") {
// code block to be executed
}
Iteracja po tablicy
Możesz użyć for..of
pętli do iteracji po elementach tablicy:
Przykład
for (const x of [1,2,3,4,5] {
// code block to be executed
}
Iteratory JavaScript
Protokół iteratora definiuje sposób tworzenia sekwencji wartości z obiektu.
Obiekt staje się iteratorem , gdy implementuje next()
metodę.
Metoda next()
musi zwrócić obiekt o dwóch właściwościach:
- wartość (następna wartość)
- gotowe (prawda lub fałsz)
wartość | Wartość zwrócona przez iterator (można pominąć, jeśli wykonane, to prawda) |
---|---|
Gotowe |
true jeśli iterator zakończył działanie false jeśli iterator wygenerował nową wartość |
Domowa iterowalna
Ten iterowalny zwrot nigdy się nie kończy: 10,20,30,40,.... Za każdym razem
next()
nazywa się:
Przykład
// Home Made Iterable
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return {value:n, done:false};
}
};
}
// Create Iterable
const n = myNumbers();
n.next(); // Returns 10
n.next(); // Returns 20
n.next(); // Returns 30
Problem z iterowalnym w domu:
Nie obsługuje instrukcji JavaScript for..of
.
Iterowalny JavaScript to obiekt, który posiada Symbol.iterator .
Jest Symbol.iterator
to funkcja, która zwraca next()
funkcję.
Element iteracyjny można iterować za pomocą kodu: for (const x of iterable) { }
Przykład
// Create an Object
myNumbers = {};
// Make it Iterable
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
Teraz możesz użyć for..of
for (const num of myNumbers) {
// Any Code Here
}
Metoda Symbol.iterator jest wywoływana automatycznie przez for..of
.
Ale możemy to też zrobić „ręcznie”:
Przykład
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}