Iteráveis JavaScript
Objetos iteráveis são objetos que podem ser iterados com for..of
.
Tecnicamente, os iteráveis devem implementar o Symbol.iterator
método.
Iterando sobre uma String
Você pode usar um for..of
loop para iterar sobre os elementos de uma string:
Exemplo
for (const x of "W3Schools") {
// code block to be executed
}
Iterando sobre um array
Você pode usar um for..of
loop para iterar sobre os elementos de um Array:
Exemplo
for (const x of [1,2,3,4,5] {
// code block to be executed
}
Iteradores JavaScript
O protocolo iterador define como produzir uma sequência de valores de um objeto.
Um objeto se torna um iterador quando implementa um next()
método.
O next()
método deve retornar um objeto com duas propriedades:
- valor (o próximo valor)
- feito (verdadeiro ou falso)
valor | O valor retornado pelo iterador (pode ser omitido se done for true) |
---|---|
feito |
true se o iterador tiver concluído false se o iterador tiver produzido um novo valor |
Iterável feito em casa
Este iterável retorna sem fim: 10,20,30,40,.... Everytime
next()
é chamado:
Exemplo
// 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
O problema com um iterável feito em casa:
Ele não suporta a for..of
instrução JavaScript.
Um JavaScript iterável é um objeto que possui um Symbol.iterator .
O Symbol.iterator
é uma função que retorna uma next()
função.
Um iterável pode ser iterado com o código: for (const x of iterable) { }
Exemplo
// 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};
}
};
}
Agora você pode usar for..of
for (const num of myNumbers) {
// Any Code Here
}
O método Symbol.iterator é chamado automaticamente pelo for..of
.
Mas também podemos fazê-lo "manualmente":
Exemplo
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}