Iterables de JavaScript
Los objetos iterables son objetos que se pueden iterar con for..of
.
Técnicamente, los iterables deben implementar el Symbol.iterator
método.
Iterando sobre una cadena
Puede usar un for..of
bucle para iterar sobre los elementos de una cadena:
Ejemplo
for (const x of "W3Schools") {
// code block to be executed
}
Iterando sobre una matriz
Puede usar un for..of
bucle para iterar sobre los elementos de una matriz:
Ejemplo
for (const x of [1,2,3,4,5] {
// code block to be executed
}
Iteradores de JavaScript
El protocolo iterador define cómo producir una secuencia de valores a partir de un objeto.
Un objeto se convierte en un iterador cuando implementa un next()
método.
El next()
método debe devolver un objeto con dos propiedades:
- valor (el siguiente valor)
- hecho (verdadero o falso)
valor | El valor devuelto por el iterador (se puede omitir si done es verdadero) |
---|---|
hecho |
verdadero si el iterador ha finalizado falso si el iterador ha producido un nuevo valor |
iterable hecho en casa
Este iterable regresa sin fin: 10,20,30,40,.... Cada vez
next()
que se llama:
Ejemplo
// 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
El problema con un hogar hecho iterable:
No es compatible con la for..of
declaración de JavaScript.
Un iterable de JavaScript es un objeto que tiene un Symbol.iterator .
es una función Symbol.iterator
que devuelve una next()
función.
Un iterable se puede iterar con el código: for (const x of iterable) { }
Ejemplo
// 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};
}
};
}
Ahora puedes usar for..of
for (const num of myNumbers) {
// Any Code Here
}
El método Symbol.iterator es llamado automáticamente por for..of
.
Pero también podemos hacerlo "manualmente":
Ejemplo
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}