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遍历数组与筛选数组的方法
Nov 05 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
Dec 29 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
Jan 27 Javascript
浅析JS异步加载进度条
May 05 Javascript
jQuery实现发送验证码并60秒倒计时功能
Nov 25 Javascript
javascript实现鼠标点击页面 移动DIV
Dec 02 Javascript
详解使用vue实现tab 切换操作
Jul 03 Javascript
vue实现表格增删改查效果的实例代码
Jul 18 Javascript
基于JS实现html中placeholder属性提示文字效果示例
Apr 19 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
Aug 30 Javascript
微信小游戏中three.js离屏画布的示例代码
Oct 12 Javascript
vue elementUI批量上传文件
Apr 26 Vue.js
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
为查询结果建立向后/向前按钮
2006/10/09 PHP
整合了前面的PHP数据库连接类~~做成一个分页类!
2006/11/25 PHP
PHP应用JSON技巧讲解
2013/02/03 PHP
PHP实现递归无限级分类
2015/10/22 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
python实现提取百度搜索结果的方法
2015/05/19 Python
python类的继承实例详解
2017/03/30 Python
Python 关于反射和类的特殊成员方法
2017/09/14 Python
python实现图片文件批量重命名
2020/03/23 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
浅析Python requests 模块
2020/10/09 Python
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
女方回门宴答谢词
2014/01/14 职场文书
社区清明节活动总结
2014/07/04 职场文书
发布会邀请函
2015/01/31 职场文书
小学感恩主题班会
2015/08/12 职场文书
Python实现老照片修复之上色小技巧
2021/10/16 Python