js 数组实现一个类似ruby的迭代器


Posted in Javascript onOctober 27, 2009

<?XML:NAMESPACE PREFIX = O />

分为如下几节:

·基本实现

·在迭代中引用原来的对象,或者直接改变数组的值而不是返回一个新数组

·向迭代传入无限多的参数

·基本实现
今天突然发现js的数组处理起来真是麻烦,代码一些就是一大堆,相比起ruby的迭代器来真是逊色不少,主要是要写的代码太多了,也许是js有特殊的处理数组的方式,真是我不知道而已,但是我真的想自己给js实现一个类似ruby的迭代器的东东,而且实现起来也不难,那就开始动手吧.

真的应该庆幸js是动态语言啊,如果是静态语言,实现起来很不方便(别说要我重新定义一个继承自array的类),不过用js实现起来就简单多了,直接给Array对象加一个方法即可,如下:

js 数组实现一个类似ruby的迭代器

额呵呵,迭代器其实已经实现了......好简单啊,是啊,不过这样的确方便了不少哦,看下面的用法就知道了:

首先我们定义一个数组:

js 数组实现一个类似ruby的迭代器

1:用法一:

迭代使用每个数组元素:

js 数组实现一个类似ruby的迭代器

声明:这里可以缩写成:aa.each(function(val){alert(val)});,以下的也同理,为了清晰,分开写的 

执行结果是依次弹出每个数组元素的值,哦呵,就是这么简单,不用写可恶的for,如果代码很多的时候,这点节省也会省出不少的代码量哦

2:用法二:

迭代处理每个数组元素并返回一个处理后哦数组:

js 数组实现一个类似ruby的迭代器

结果如何?如你所想,首先弹出的是"1,2,3,4",之后弹出的是"2,4,6,8",每个元素都被处理了,并且作为新数组返回,额呵呵,很简单的功能,如果你觉得没什么用的话,那好吧,还是去写for循环吧,如果你喜欢这种写法,那好吧,还有很多可以改进的地方,也留给大家去探索,反正这样目前对我来说已经足够用来节省很多代码了.

3:更多:

还可以给数组增加更多有用的方法,例如:随机打乱顺序(棋牌游戏?)等,不过真希望js可以在方法名中包含更多的标点符号,那样就可以定义 each?或者each!这种警示性方法了,可惜可惜

·在迭代中引用原来的对象,或者直接改变数组的值而不是返回一个新数组

我这里有一个可以说是改进版的迭代器,因为我突然要在func函数里引用原来的迭代对象,于是做了如下修改

js 数组实现一个类似ruby的迭代器

变化并不大,也兼容前面所讲的所有功能,而且增加了对数组对象的引用

js 数组实现一个类似ruby的迭代器

我们可以在func函数里引用原来的数组对象,和当前元素的索引位置,这样可以增加很多功能哦,首先可以直接修改原来数组的值,!!!不过如果你在func函数里删除了某个数组元素,可能会出现不可预料的错误哦!!!,下面来做个试验,看看会出现什么结果:

js 数组实现一个类似ruby的迭代器

哦,我们在func函数里删除了值为2的元素,结果呢,依次弹出1,3,4,undefined,也就是迭代函数无法知道你的数组长度改变了,多循环了一次,如何解决这个问题呢?

js 数组实现一个类似ruby的迭代器

初步想法是,判断一下元素是否为空,如果为空,就不做任何操作,&&操作符的前面如果为假,就不会执行后面的语句.今天发现这种方法有所欠考虑,因为我漏处理了一个元素,仔细想想就知道了,所以需要在处理函数里加一个offset变量,指引当前的偏移量,每次删除元素就将offset变量减一,索引以index+offset为准,这样可以解决删除元素的问题,但是不能解决增加元素的问题,所以这个迭代器里不能动态增加数组元素,否则会出现错误,注意注意

先到此为止吧.

·向迭代传入无限多的参数

又回来了,这次我们要让这个迭代可以传递更多的有用的自定义参数,而不是系统自定的,当然,前面的所有操作都是被兼容的,所有的修改都不会破坏前面的操作的兼容性.

我们将主方法修改如下:

js 数组实现一个类似ruby的迭代器

OK,加了个参数,只是一个参数,没有什么大惊小怪,但是它已经可以完成所有的参数传递了,看例子:

js 数组实现一个类似ruby的迭代器

还是刚才的例子,我们要删除数组中的一个元素,我们通过传递进来的参数来确定删除哪个值,我们用一个对象作为参数传进来,这个对象是个json对象,欧耶,json可以承载任意多的参数,想传多少就传多少,不是很简单么,好像我们已经实现了很多功能了.但是还没有完,更多的需要自己去探索.

只用拓展ie的forEach就行了,ff下已经支持了,而且你这种写法貌似效率很低

Javascript 相关文章推荐
$.format,jquery.format 使用说明
Jul 13 Javascript
用js判断是否为360浏览器的实现代码
Jan 15 Javascript
js实现点击链接后延迟3秒再跳转的方法
Jun 05 Javascript
jQuery给元素添加样式的方法详解
Dec 30 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
May 20 Javascript
easyui导出excel无法弹出下载框的快速解决方法
Nov 10 Javascript
[js高手之路]单例模式实现模态框的示例
Sep 01 Javascript
vue iview组件表格 render函数的使用方法详解
Mar 15 Javascript
JavaScript使用Math.random()生成简单的验证码
Jan 21 Javascript
基于layPage插件实现两种分页方式浅析
Jul 27 Javascript
angula中使用iframe点击后不执行变更检测的问题
May 10 Javascript
js抽奖转盘实现方法分析
May 16 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
Oct 27 #Javascript
javascript获得CheckBoxList选中的数量
Oct 27 #Javascript
基于jQuery的日期选择控件
html 锁定页面(js遮罩层弹出div效果)
Oct 27 #Javascript
javascript 读取XML数据,在页面中展现、编辑、保存的实现
Oct 27 #Javascript
Ajax+Json 级联菜单实现代码
Oct 27 #Javascript
javascript 关于# 和 void的区别分析
Oct 26 #Javascript
You might like
php模板之Phpbean的目录结构
2008/01/10 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
python 读写中文json的实例详解
2017/10/29 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
python地震数据可视化详解
2019/06/18 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
卫校中专生个人自我评价
2013/09/19 职场文书
求职简历中自我评价
2014/01/28 职场文书
优秀护士获奖感言
2014/02/20 职场文书
爱心捐款倡议书
2014/04/14 职场文书
学习党代会心得体会
2014/09/05 职场文书
小学生交通安全寄语
2015/02/27 职场文书
英语演讲开场白
2015/05/29 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android