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 
});

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大小小丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值