[js高手之路] 设计模式系列课程 - 迭代器(1)
迭代器是指通过一种形式依次遍历数组,对象,或者类数组结构中的每个元素. 常见的有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
二、利用迭代器,判断两个数组的长度和对应的位置的值是否相等
function each( arr, fn ) {
for( var i = 0, len = arr.length; i < len; i++ ){
fn.call( arr, arr[i], i );
}
}
function isEqual( arr1, arr2 ){
var flag = false;
if( arr1.length != arr2.length ){
throw new Error( '数组的长度不相等' );
}
each( arr1, function( val, key ){
if ( val != arr2[key] ) {
throw new Error('数组的第' + (key+1) + '项不相等');
}
});
return true;
}
console.log( isEqual( [ 10, 20, 30 ], [ 10, 20, 30 ] ) );
三、另一种迭代器
function Iterator( obj ){
var curInd = 0;
var next = function(){
curInd += 1;
};
var isDone = function(){
return curInd >= obj.length;
};
var current = function(){
return obj[curInd];
};
return {
next : next,
isDone : isDone,
current : current
};
}
var obj = null;
obj = Iterator( [ 10, 20, 30 ] );
console.log( obj.current(), obj.isDone() ); // 10, false
obj.next();
console.log( obj.current(), obj.isDone() ); // 20, false
obj.next();
console.log( obj.current(), obj.isDone() ); // 30, false
obj.next();
console.log( obj.current(), obj.isDone() ); // undefined, true
四,使用上面的迭代器,改写两个数组的比较
function Iterator( obj ){
var curInd = 0;
var next = function(){
curInd += 1;
};
var isDone = function(){
return curInd >= obj.length;
};
var current = function(){
return obj[curInd];
};
return {
next : next,
isDone : isDone,
current : current
};
}
function compare( it1, it2 ){
while( !it1.isDone() && !it2.isDone() ){
if( it1.current() != it2.current() ){
throw new Error( '数组不相等' );
}
it1.next();
it2.next();
}
return true;
}
var Iterator1 = Iterator([ 10, 20, 30 ]);
var Iterator2 = Iterator([ 10, 20, 30 ]);
console.log( compare( Iterator1, Iterator2 ) );
[js高手之路] 设计模式系列课程 - 迭代器(1)的更多相关文章
- [js高手之路] 设计模式系列课程 - jQuery的extend插件机制
这里在之前的文章[js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数基础上增加一个extend浅拷贝,可以为对象方便的扩展属性和方法, jquery的插件扩展机制,大致就是这 ...
- [js高手之路]设计模式系列课程-发布者,订阅者重构购物车
发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...
- [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表
所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...
- [js高手之路] 设计模式系列课程 - DOM迭代器(2)
如果你对jquery比较熟悉的话,应该用过 eq, first, last, get, prev, next, siblings等过滤器和方法.本文,我们就用迭代设计模式来封装实现,类似的功能 < ...
- [js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数
一.我们从一个简单的构造函数+原型程序开始 var G = function(){}; G.prototype = { length : 5, size : function(){ return th ...
- [js高手之路]设计模式系列课程-单例模式实现模态框
什么是单例呢? 单,就是一个的意思.例:就是实例化出来的对象,那合在一起就是保证一个构造函数只能new出一个实例,为什么要学习单例模式呢?或者说单例模式有哪些常见的应用场景.它的使用还是很广泛,比如: ...
- [js高手之路]设计模式系列课程-设计一个模块化扩展功能(define)和使用(use)库
模块化的诞生标志着javascript开发进入工业时代,近几年随着es6, require js( sea js ), node js崛起,特别是es6和node js自带模块加载功能,给大型程序开发 ...
- [js高手之路]设计模式系列课程-委托模式实战微博发布功能
在实际开发中,经常需要为Dom元素绑定事件,如果页面上有4个li元素,点击对应的li,弹出对应的li内容,怎么做呢?是不是很简单? 大多数人的做法都是:获取元素,绑定事件 <ul> < ...
- [js高手之路] es6系列教程 - 迭代器与生成器详解
什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...
随机推荐
- (转载)公开的海量数据集 Public Research-Quality Datasets
转载自:http://rensanning.iteye.com/blog/1601663 海量数据数据集 海量数据(又称大数据)已经成为各大互联网企业面临的最大问题,如何处理海量数据,提供更好的解决方 ...
- 【Java学习笔记之三十】详解Java单例(Singleton)模式
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- 流畅python学习笔记:第十九章:动态属性和特性
首先来看一个json文件的读取.书中给出了一个json样例.该json文件有700多K,数据量充足,适合本章的例子.文件的具体内容可以在http://www.oreilly.com/pub/sc/os ...
- MySQL之数据的备份与还原
备份db_book:这里用到了cmd,以管理员方式运行,不然后面使用mysqldump会被拒绝访问!!! 1.启动cmd,输入命令,切换到MySQL的bin文件: 2.然后输入备份命令: 备份好的sq ...
- React 实现一个漂亮的 Table
概述 对于企业级后台产品来说,Table 应该是使用最频繁的组件了,它通常比 Form 和 Chart 的使用还频繁.对于这么一个常用的组件,我们决定要把它从 RSuite 中单独出来开发,并且要具有 ...
- [2013-03-14]使用wiki维护产品文档
word文档作为产品文档的问题: word文档本身的设计是为了打印: word文档的编辑较为繁琐: 作为产品文档的word文档往往长达百页以上,难以维护,且容易分散注意力,不利于查阅: 没有一个简单易 ...
- 手工删除crfclust.bdb文件
环境:RHEL 6.5 + Oracle 11.2.0.4 RAC 现象:巡检发现自己的测试环境节点2的空间使用率过高,进一步查询,发现大文件是GI目录下crfclust.bdb文件. crfclus ...
- 【C#多线程编程实战笔记】一、 线程基础
创建线程 Thread :所执行的方法不能有参数. class Program { static void Main(string[] args) { Console.WriteLine(" ...
- java.lang.ClassNotFoundException: com.sun.jna.Native
在使用sprng boot加elasticsearch的时候遇到 java.lang.ClassNotFoundException: com.sun.jna.Native,百度之后要我导入 <d ...
- python 从视频中提取图片,并保存在硬盘上
使用python的moviepy库来提取视频中的图片,按照视频每帧一个图片的方式来保存. extract images from video, than save them to disk from ...