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 });
迭代器模式是一种相对简单的模式,简单到很多时候我们都不认为它是一种设计模式。目前 的绝大部分语言都内置了迭代器。
下一篇:
JS数据结构与算法之链表