/**
* To demonstrate Iterators and Genearators
*
*/
//Some Object like Array, String, Map, Set are by default iterable
//while other custom types like class are not iterable. So we can define custom iterable for them
//Demo of existing iterable objects.we can use For Of or For In loop to iterate over them
var fruits = ["Mango","Banana","Apple","Kivi"];
for(let name of fruits){
console.log("fruit name : " + name);
}
//Iteration of Array using Symbol.Iterator. Since Iterators are in build for array we dont need to define it
//the next() method returns the object with properties "value" and "done".
//"value" denotes actual value and done returns TRUE when all objects finished with iterations.
let cities = ["Mumbai","Singapore","Tokyo","London", "New York","Beijing"];
let iterCities = cities[Symbol.iterator]();
let city;
do{
city = iterCities.next();
console.log("City Name :: " + city.value +", done :: " + city.done);
}while(!city.done);
//define custom Iterator for custom class
class EmployeeList {
constructor(arrayOfEmployee){
this.employees = [].concat(arrayOfEmployee);
}
[Symbol.iterator](){
let index=0;
let employeeList = this.employees;
return{
next:function(){
let emp = employeeList[index];
index++;
if(index<employeeList.length){
return {
value : emp,
done :false
}
} else {
return {
value : undefined,
done : true
}
}
}
}
}
}
let employee1 = {firstName :"James", lastName:"Kore",getInfo : function(){return "first Name : " + this.firstName+" last Name : "+this.lastName;}};
let employee2 = {firstName : "Tejas", lastName:"Goyal",getInfo : function(){return "first Name : " + this.firstName+" last Name : "+this.lastName;}};
let employee3 = {firstName : "Wu", lastName : "Xi",getInfo : function(){return "first Name : " + this.firstName+" last Name : "+this.lastName;}};
var arrayOfEmployee = [employee1, employee2, employee3];
let listOfEmployee = new EmployeeList(arrayOfEmployee);
let employeeItr = listOfEmployee[Symbol.iterator]();
let currentEmployee;
do{
currentEmployee = employeeItr.next();
console.log("currentEmployee ::" + currentEmployee +", done :" + currentEmployee.done+" employee.firstName ::" + currentEmployee.firstName+" employee.lastName ::" + currentEmployee.lastName);
}while(!currentEmployee.done);
//Generators
function * getName(){
console.log("Step 1")
yield "Robert"
console.log("Step 2")
yield "Robin"
console.log("Step 3")
yield "Rocky"
console.log("End of function")
}
//return an iterator object
let nameIter = getName()
//invoke statements until first yield
console.log(nameIter.next())
//resume execution after the last yield until second yield expression
console.log(nameIter.next())
//resume execution after last yield until third yield expression
console.log(nameIter.next())
console.log(nameIter.next())
Output
