迭代器模式,简言之就是数组或者对象遍历。比如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
});
迭代器模式是一种相对简单的模式,简单到很多时候我们都不认为它是一种设计模式。目前
的绝大部分语言都内置了迭代器。