Categories
ECMAScript Javascript

Iterator

/**
 * 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

Leave a comment

Design a site like this with WordPress.com
Get started