obj[Symbol.iterator] // a function that returns an Iterator 'instance'
obj[Symbol.iterator]() // Iterator
// an iterator is an object with an method:
// .next() that returns { value: any, done: boolean}
{ next: () => ({ value: 1, done: false}) }
// generators return an Iterator
function* range(from, to) {
let i = from;
while (i <= to) {
yield i;
i++;
}
}
const a = { [Symbol.iterator]: () => range(0, 10) };
for (const item of a) console.log(item);
(()=>{
function* iterator(iterable) {
for(const item of iterable)
yield item;
}
const x = ['a', 'b'];
const y = ['c', 'd'];
console.log(x.concat(y));
const b = { [Symbol.iterator]: () => iterator(x.concat(y)) };
for (const item of b) console.log(item);
})();
https://codeburst.io/a-simple-guide-to-es6-iterators-in-javascript-with-examples-189d052c3d8e
const myFavouriteAuthors = {
allAuthors: {
fiction: [
'Agatha Christie',
'J. K. Rowling',
'Dr. Seuss'
],
scienceFiction: [
'Neal Stephenson',
'Arthur Clarke',
'Isaac Asimov',
'Robert Heinlein'
],
fantasy: [
'J. R. R. Tolkien',
'J. K. Rowling',
'Terry Pratchett'
],
},
[Symbol.iterator]() {
// Get all the authors in an array
const genres = Object.values(this.allAuthors);
// Store the current genre and author index
let currentAuthorIndex = 0;
let currentGenreIndex = 0;
return {
// Implementation of next()
next() {
// authors according to current genre index
const authors = genres[currentGenreIndex];
// doNotHaveMoreAuthors is true when the authors array is exhausted.
// That is, all items are consumed.
const doNothaveMoreAuthors = !(currentAuthorIndex < authors.length);
if (doNothaveMoreAuthors) {
// When that happens, we move the genre index to the next genre
currentGenreIndex++;
// and reset the author index to 0 again to get new set of authors
currentAuthorIndex = 0;
}
// if all genres are over, then we need tell the iterator that we
// can not give more values.
const doNotHaveMoreGenres = !(currentGenreIndex < genres.length);
if (doNotHaveMoreGenres) {
// Hence, we return done as true.
return {
value: undefined,
done: true
};
}
// if everything is correct, return the author from the
// current genre and incerement the currentAuthorindex
// so next time, the next author can be returned.
return {
value: genres[currentGenreIndex][currentAuthorIndex++],
done: false
}
}
};
}
};
for (const author of myFavouriteAuthors) {
console.log(author);
}
console.log(...myFavouriteAuthors)
329200cookie-checkJavascript create an iterator