js设计模式四 - 迭代器模式

迭代器模式,简言之就是数组或者对象遍历。比如for, forEach, for…in…等。目前,恐怕只有在一些“古董级”的语言中才会为实现一个迭代器模式而烦恼,现在流行的大部分语言如 Java、Ruby 等都已经有了内置的迭代器实现,许多浏览器也支持 JavaScript 的Array.prototype.forEach。 开过过程中比较常用的迭代器有以下几种: 1.内部迭代器

let compare =  function(arr1, arr2){
          
   
	if(arr1.length !== arr2.length){
          
   
	   throw new Error(arr1和arr2不相等)
	}
	each(arr1, function(i, n){
          
   
		if(n !== arr2[i]){
          
   
			throw new Error(arr1和arr2不相等)
		}
	 })
	 alert(arr1和arr2相等)
}
compare([1,2,3], [1,2,4]) //throw new error arry1和arry2不相等

2.外部迭代器,常用!

let Interator = function(obj){
          
   
	let current = 0;
	return {
          
   
		next: ()=>{
          
   
			current++;
		},
		isDone: ()=>{
          
   
		  return  current >= obj.length;
		},
		getCurrentItem: ()=>{
          
   
			return obj[current];
		}
	}
}
let compare = function(interator1, interator2){
          
   
   while(!interator1.isDone() && !interator2.isDone()){
          
   
   		if(iterator1.getCurrentItem() !== interator2.getCurrentItem()){
          
   
   			throw new Error(interator1 interator2不相等)
   		}
		interator1.next();
		interator2.next();
	}
	alert(interator1 interator2相等)
}
compare(Interator([1,2,3], Interator([1,2,3])))

3.迭代类数组对象和字面量对象(相当于for in)

$.each = function( obj, callback ) {
          
    
	 var value, 
	 i = 0, 
	 length = obj.length, 
	 isArray = isArraylike( obj ); 
	 if ( isArray ) {
          
    // 迭代类数组
		 for ( ; i < length; i++ ) {
          
    
		 value = callback.call( obj[ i ], i, obj[ i ] ); 
			 if ( value === false ) {
          
    
				 break; 
			 } 
		 } 
	 } else {
          
    
		 for ( i in obj ) {
          
    // 迭代 object 对象
			 value = callback.call( obj[ i ], i, obj[ i ] ); 
			 if ( value === false ) {
          
    
			 	break; 
			 } 
	      } 
    } 
 return obj; 
};

4.倒序迭代器

let reverseEach = function(arr, callback){
          
   
	for(let i = arr.length-1; i >=0; i--){
          
   
		callback(i, arr[i])
	}
}
reverseEach([0,1,2], function(i, n){
          
   
	console.log(n) // 2,1,0
})

5.终止迭代器

var each = function( ary, callback ){
          
    
 for ( var i = 0, l = ary.length; i < l; i++ ){
          
    
	 if ( callback( i, ary[ i ] ) === false ){
          
    // callback 的执行结果返回 false,提前终止迭代
	 	break; 
	 } 
 } 
}; 
each( [ 1, 2, 3, 4, 5 ], function( i, n ){
          
    
 if ( n > 3 ){
          
    // n 大于 3 的时候终止循环
 return false; 
 } 
 console.log( n ); // 分别输出:1, 2, 3 
});

迭代器模式是一种相对简单的模式,简单到很多时候我们都不认为它是一种设计模式。目前 的绝大部分语言都内置了迭代器。

经验分享 程序员 微信小程序 职场和发展