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 相关文章推荐
JQuery读取XML文件数据并显示的实现代码
Dec 16 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
利用cookie记住背景颜色示例代码
Nov 04 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
Jan 27 Javascript
js实现连个数字相加而不是拼接的方法
Feb 23 Javascript
angularJS 中input示例分享
Feb 09 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
jQuery实现滚动切换的tab选项卡效果代码
Aug 26 Javascript
基于jquery实现复选框全选,反选,全不选等功能
Oct 16 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 Javascript
Angular使用ng-messages与PHP进行表单数据验证
Dec 28 Javascript
jQuery实现tab栏切换效果
Dec 22 jQuery
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分页的功能模块
2015/06/16 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
在Python中实现贪婪排名算法的教程
2015/04/17 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
介绍一下Java中的static关键字
2012/05/12 面试题
考博专家推荐信模板
2013/12/02 职场文书
创意活动策划书
2014/01/15 职场文书
新农村建设典型材料
2014/05/31 职场文书
捐资助学感谢信
2015/01/21 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
合同纠纷调解书
2015/05/20 职场文书
赢在中国观后感
2015/06/02 职场文书
公司晚会主持词
2019/04/17 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
Python自动化测试PO模型封装过程详解
2021/06/22 Python
Python实现生活常识解答机器人
2021/06/28 Python
spring boot中nativeQuery的用法
2021/07/26 Java/Android
DIY胆机必读:各国电子管评价
2022/04/06 无线电
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android