博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[js高手之路] 设计模式系列课程 - 迭代器(1)
阅读量:6256 次
发布时间:2019-06-22

本文共 3167 字,大约阅读时间需要 10 分钟。

迭代器是指通过一种形式依次遍历数组,对象,或者类数组结构中的每个元素. 常见的有jquery中的each方法, ES5自带的forEach方法. 下面我们就来自定义一个类似jquery或者ES5的迭代器方法

1         function each( arr, fn ) {2             for( var i = 0, len = arr.length; i < len; i++ ){3                 fn.call( arr, arr[i], i );4             }5         }6         each( [ 'zhangsan', 'lisi', 'ghostwu' ], function( val, key ){ 7 console.log( this, val, key ); 8 });

输出结果:

["zhangsan", "lisi", "ghostwu"] "zhangsan" 0
["zhangsan", "lisi", "ghostwu"] "lisi" 1
["zhangsan", "lisi", "ghostwu"] "ghostwu" 2

二、利用迭代器,判断两个数组的长度和对应的位置的值是否相等

1         function each( arr, fn ) { 2             for( var i = 0, len = arr.length; i < len; i++ ){ 3                 fn.call( arr, arr[i], i ); 4             } 5         } 6         function isEqual( arr1, arr2 ){ 7             var flag = false; 8             if( arr1.length != arr2.length ){ 9                 throw new Error( '数组的长度不相等' );10             }11             each( arr1, function( val, key ){12                 if ( val != arr2[key] ) {13                     throw new Error('数组的第' + (key+1) + '项不相等');14                 }15             });16             return true;17         }18         console.log( isEqual( [ 10, 20, 30 ], [ 10, 20, 30 ] ) );

三、另一种迭代器

1         function Iterator( obj ){ 2             var curInd = 0; 3             var next = function(){ 4                 curInd += 1; 5             }; 6             var isDone = function(){ 7                 return curInd >= obj.length; 8             }; 9             var current = function(){10                 return obj[curInd];11             };12             return {13                 next : next,14                 isDone : isDone,15                 current : current16             };17         }18         var obj = null;19         obj = Iterator( [ 10, 20, 30 ] );20         console.log( obj.current(), obj.isDone() ); // 10, false21         obj.next();22         console.log( obj.current(), obj.isDone() ); // 20, false23         obj.next();24         console.log( obj.current(), obj.isDone() ); // 30, false25         obj.next();26         console.log( obj.current(), obj.isDone() ); // undefined, true

四,使用上面的迭代器,改写两个数组的比较

1         function Iterator( obj ){ 2             var curInd = 0; 3             var next = function(){ 4                 curInd += 1; 5             }; 6             var isDone = function(){ 7                 return curInd >= obj.length; 8             }; 9             var current = function(){10                 return obj[curInd];11             };12             return {13                 next : next,14                 isDone : isDone,15                 current : current16             };17         }18 19         function compare( it1, it2 ){20             while( !it1.isDone() && !it2.isDone() ){21                 if( it1.current() != it2.current() ){22                     throw new Error( '数组不相等' );23                 }24                 it1.next();25                 it2.next();26             }27             return true;28         }29 30         var Iterator1 = Iterator([ 10, 20, 30 ]);31         var Iterator2 = Iterator([ 10, 20, 30 ]);32 33         console.log( compare( Iterator1, Iterator2 ) );

 

转载地址:http://xetsa.baihongyu.com/

你可能感兴趣的文章
最长回文子串
查看>>
Node-mongodb链接数据库函数的封装
查看>>
在CentOS上简单安装tengine
查看>>
c语言——字符串变量、函数
查看>>
解决Type safety: The expression of type List needs
查看>>
POJ 3233 (矩阵)
查看>>
20161220
查看>>
11月27日
查看>>
Java位运算符
查看>>
智能手表ticwatch穿戴体验
查看>>
暑假第五周总结(2018.8.6-8.12)
查看>>
MFC下拉框Combo Box
查看>>
TCP带外数据读写
查看>>
uni-app采坑记录
查看>>
TP方法中打印地址栏中所有的参数:
查看>>
这是一个蒟蒻的计划……QAQ
查看>>
设置局域网共享文件不需要用户名密码
查看>>
raft--分布式一致性协议
查看>>
Solidity notes
查看>>
网上购物系统(Task005)——通用数据库访问函数集SqlHelper类
查看>>