Soy un principiante leyendo el capítulo Iteradores del libro.
JavaScript: la guía definitiva
No puedo entender el método next() en el siguiente ejemplo del libro que trata sobre la creación de una alternativa iterable al método filter() de las matrices de JavaScript.
// Return an iterable object that filters the specified iterable, // iterating only those elements for which the predicate returns true function filter(iterable, predicate) { let iterator = iterable[Symbol.iterator](); return { // This object is both iterator and iterable [Symbol.iterator]() { return this; }, next() { for(;;) { let v = iterator.next(); if(v.done || predicate(v.value)) { return v; } } } }; }Probemos esta función con una matriz.
let a = [1,2,3,4,5] let iter = filter(a, x => x>3) // Call the function // Lets check the returned object of iter.next() method iter.next() // {value: 4, done: false} iter.next() // {value: 5, done: false} iter.next() // {value: undefined, done: true} Estoy completamente confundido acerca del método next() aquí. Por favor, ayúdame a entenderlo.
Además, no puedo entender que... el método next() contiene un bucle for infinito. Pero lo que hace es romper ese bucle. No hay condición como esa aquí.
Gracias de antemano
Además, no puedo entender que... el método next() contiene un bucle for infinito. Pero lo que hace es romper ese bucle. No hay condición como esa aquí.
el return rompe el bucle.
Estoy completamente confundido acerca del método next() aquí. Por favor, ayúdame a entenderlo.
Esto es lo que está haciendo:
next para obtener el siguiente objeto de resultado, que almacena en v .v.done es veraz, devuelve v (interrumpiendo el ciclo). Esto significa que el iterador ha llegado al final de su secuencia.v.done es falso, llama al predicate que pasa en v.value ; si el predicate devuelve un valor verdadero, next devuelve v (interrumpiendo el bucle). Entonces, el resultado es que el iterador devuelto por esa función de filter iterará los valores para los que el predicado devuelve un valor verdadero, y devolverá un objeto de resultado con done establecido en un valor verdadero cuando llegue al final de la entrada interable.
No he leído las ediciones recientes del libro (compré el mío hace unos 15 años), pero supongo que el código dado está destinado a mostrar cómo usaría un iterador explícitamente, y luego Flanagan presentará for-of y funciones de generador, que proporcionan un medio más simple de hacer ese filter :
function* filter(iterable, predicate) { for (const element of iterable) { if (predicate(element)) { yield element; } } }Ejemplo en vivo:
function* filter(iterable, predicate) { for (const element of iterable) { if (predicate(element)) { yield element; } } } let a = [1,2,3,4,5]; let iter = filter(a, x => x>3); // Call the function // Lets check the returned object of iter.next() method console.log(iter.next()); // {value: 4, done: false} console.log(iter.next()); // {value: 5, done: false} console.log(iter.next()); // {value: undefined, done: true} Fui de un lado a otro entre implícitos ( for-of , generadores) y explícitos en el capítulo 6 de mi reciente libro JavaScript: The New Toys . Descubrí que intercalarlos era lo mejor que podía hacer para ayudar a transmitir los conceptos pero también los detalles.