-
-
Save dinkarinjosh/6afbd4afaaab04463b7ec937c0dc56d2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /**************************************** | |
| ES6 Iterators and Generators | |
| Arrays, Strings, Maps, Sets, NodeLists - built-in iterators | |
| {Object} => Iterator => Generator | |
| ****************************************/ | |
| let log = console.log; | |
| let characters = ['Finn','Poe', 'Rey', 'Kylo', 'Luke', 'Leia'] | |
| function* genny(){ | |
| let i = 0; | |
| yield characters[i]; | |
| i++; | |
| yield characters[i]; | |
| i++; | |
| yield characters[i]; | |
| i++; | |
| yield characters[i]; | |
| i++; | |
| yield characters[i]; | |
| i++; | |
| yield characters[i]; | |
| i++; | |
| yield characters[i]; | |
| i++; | |
| yield characters[i]; | |
| } | |
| //let iter = genny(); | |
| //log(iter) | |
| //log(iter.next()); | |
| //log(iter.next()); | |
| //log(iter.next()); | |
| //log(iter.next()); | |
| //log(iter.next()); | |
| //log(iter.next()); | |
| //log(iter.next()); | |
| //log(iter.next()); | |
| //log(iter.next()); | |
| let starwars8 = { | |
| title: 'The Last Jedi', | |
| director: 'Rian Johnson', | |
| year: 2017, | |
| boxOffice: '1.3B' | |
| } | |
| let count = -1; | |
| let SW8 = { | |
| [Symbol.iterator]: function(obj){ | |
| return { | |
| next: ()=>{ | |
| count++; | |
| switch(count) { | |
| case 0: | |
| return { | |
| value: obj.title, | |
| done: false} | |
| case 1: | |
| return { | |
| value: obj.year, | |
| done: false | |
| } | |
| case 2: | |
| return { | |
| value: obj.director, | |
| done: false | |
| } | |
| case 3 : | |
| return { value: undefined, done: true} | |
| default: | |
| return { value: undefined, done: true} | |
| } | |
| } | |
| } | |
| } | |
| } | |
| let data = SW8[Symbol.iterator](starwars8); | |
| log( data.next() ); | |
| log( data.next() ); | |
| log( data.next() ); | |
| log( data.next() ); | |
| log( data.next() ); | |
| // | |
| //for(let p of starwars8){ | |
| // for of loops are using the .next( ) method behind the scenes | |
| //} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| This second version has two objects - `Obj1` and `Obj2` | |
| The generator `myGenerator`, is put in the prototype chain for both objects | |
| This way we can call the [Symbol.iterator] method on each object to give them each their own iterator. | |
| The new version of the Iterator also checks for the existence of the property, to make this more generic. It will | |
| display a message about missing properties. | |
| **/ | |
| const log = console.log; // this was missing | |
| let Obj1 = { | |
| title: 'The Last Jedi', | |
| director: 'Rian Johnson', | |
| year: 2017, | |
| }; | |
| let Obj2 = { | |
| title: 'The Hobbit', | |
| director: 'Peter Jackson', | |
| boxOffice: '1.017B', | |
| }; | |
| let myGenerator = { | |
| [Symbol.iterator]: function () { | |
| let count = -1; //reset the count | |
| return { | |
| next: () => { | |
| count++; | |
| switch (count) { | |
| case 0: | |
| return { | |
| value: this.title ? this.title : 'No title property', | |
| done: false, | |
| }; | |
| case 1: | |
| return { | |
| value: this.year ? this.year : 'No year property', | |
| done: false, | |
| }; | |
| case 2: | |
| return { | |
| value: this.director ? this.director : 'No director property', | |
| done: false, | |
| }; | |
| default: | |
| return { value: undefined, done: true }; | |
| } | |
| }, | |
| }; | |
| }, | |
| }; | |
| Object.setPrototypeOf(Obj1, myGenerator); | |
| Object.setPrototypeOf(Obj2, myGenerator); | |
| let data1 = Obj1[Symbol.iterator](); //create the iterator for Obj1 | |
| //this sets count to -1 | |
| for (let prop of Obj1) { | |
| log(data1.next()); | |
| } | |
| log('\n\n'); | |
| let data2 = Obj2[Symbol.iterator](); //create the iterator for Obj2 | |
| //this sets count to -1 again | |
| for (let prop of Obj2) { | |
| // log(data2.next()); // instead log(prop) since for...of internally calls the next() method | |
| log(prop); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment