JS逆序遍历实现代码


Posted in Javascript onDecember 02, 2014

最常用的遍历方式为for语句(也有递归、while方式)。当我们遍历一个数组的时候,我们一般会这么做:

var arr = [1,2,3,4,5,6,7,8,9,10];

for(var i=0,total=arr.length;i<total;i++){

  console.log(i,arr[i]);

}

这就是最常用的遍历方式:正序遍历。它从数组的第一项依次走到最后一项。

那为什么今天小剧还会提到逆序遍历呢?

这里不得不提下小剧写的组件里最常用的一个模块:events。用于创建自定义事件模型,处理事件的监听及触发,最简单的发布订阅(pub/sub)模式。因为最近发现存在内存溢出的隐患,需要在原有的基础上增加一个解除绑定的方法。

因为同一事件名的回调函数是放在同一数组中,解除绑定也只需要从数组中找到对应的回调函数(同一回调函数可能绑定多次),并且移除即可。

很简单的需求,于是很自然地写出类似下面的代码:

//移除数组中的2

var arr = [1,2,2,2,2,1,1,2,2];

for(var i=0,total=arr.length;i<total;i++){

  if(arr[i] == 2){

    //符合条件,移除

    arr.splice(i,1);

  }

}

console.log(arr);

很正常的代码有木有,可最终输出结果却是:[1, 2, 2, 1, 1, 2],显然执行结果不符合预期。

问题出在哪儿呢?

仔细分析了一下,发现问题出在了每次匹配成功,执行移除操作之后,都会跳过下一个待检查项,因为数组中之后的每一项都向前上升一位。

找到了问题所在,改了下代码,在执行移除操作之后,调整序列索引index(i)。

//移除数组中的2

var arr = [1,2,2,2,2,1,1,2,2];

for(var i=0,total=arr.length;i<total;i++){

  if(arr[i] == 2){

    //符合条件,移除

    arr.splice(i,1);

    //调整序列索引

    i = i-1;

  }

}

console.log(arr);

问题解决了,但总感觉修改序列索引是件调戏for循环的事。于是灵光一闪,啪啪啪,敲出下面的代码:

//移除数组中的2

var arr = [1,2,2,2,2,1,1,2,2];

for(var i = arr.length-1;i!=-1;i--){

  if(arr[i] == 2){

    //符合条件,移除

    arr.splice(i,1);

  }

}

console.log(arr);

遍历的过程不变,唯一变化的是遍历的顺序变了,对了,还少了一个变量total。

好吧,我承认今天写的东西很?潘浚??ü?飧隼?樱??院笮创?氲氖焙蛱崃烁鲂眩?诒槔??讨校?绻?婕暗叫薷氖?楸旧恚ㄔ錾荆??嫘虮槔?歉霰冉媳O盏谋槔?绞健?/p>

coding笔记,留给以后嘲笑自己!

转载请注明来源:http://bh-lay.com/blog/148c07761fa

Javascript 相关文章推荐
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
js中cookie的添加、取值、删除示例代码
Oct 21 Javascript
js实现可拖动DIV的方法
Dec 17 Javascript
JS动态显示表格上下frame的方法
Mar 31 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
Jun 16 Javascript
AngularJs html compiler详解及示例代码
Sep 01 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
COM组件中调用JavaScript函数详解及实例
Feb 23 Javascript
使用JS编写的随机抽取号码的小程序
Aug 11 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
Oct 10 Javascript
Vue单文件组件开发实现过程详解
Jul 30 Javascript
echarts实现晶体球面投影的实例教程
Oct 10 Javascript
javascript框架设计读书笔记之数组的扩展与修复
Dec 02 #Javascript
javascript框架设计读书笔记之字符串的扩展和修复
Dec 02 #Javascript
javascript框架设计读书笔记之模块加载系统
Dec 02 #Javascript
javascript框架设计读书笔记之种子模块
Dec 02 #Javascript
推荐一个封装好的getElementsByClassName方法
Dec 02 #Javascript
CSS3,HTML5和jQuery搜索框集锦
Dec 02 #Javascript
JavaScript和CSS交互的方法汇总
Dec 02 #Javascript
You might like
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
在Python程序中实现分布式进程的教程
2015/04/28 Python
python使用socket进行简单网络连接的方法
2015/04/29 Python
Python fileinput模块使用实例
2015/05/28 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
python实现中文文本分句的例子
2019/07/15 Python
Python模块常用四种安装方式
2020/10/20 Python
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
后进生转化工作制度
2014/01/17 职场文书
战友聚会主持词
2014/04/02 职场文书
《锄禾》教学反思
2014/04/08 职场文书
购房协议书范本
2014/04/11 职场文书
酒店销售经理岗位职责
2015/04/02 职场文书
民主生活会意见
2015/06/05 职场文书
Golang Web 框架Iris安装部署
2022/08/14 Python