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 checkbox全选/取消全选实现代码
Nov 14 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
Jan 08 Javascript
JavaScript自执行闭包的小例子
Jun 29 Javascript
js实现鼠标经过表格行变色的方法
May 12 Javascript
javascript委托(Delegate)blur和focus用法实例分析
May 26 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
Nov 02 Javascript
jquery实现下拉框多选方法介绍
Jan 03 Javascript
node.js遍历目录的方法示例
Aug 01 Javascript
5分钟快速看懂ES6中的反射与代理
Dec 19 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
Apr 17 Javascript
js实现盒子拖拽动画效果
Aug 09 Javascript
JavaScript实现前端网页版倒计时
Mar 24 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
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
JavaScript 原型与继承说明
2010/06/09 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
用客户端js实现带省略号的分页
2013/04/27 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
js中日期的加减法
2015/05/06 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python中random模块用法实例分析
2015/05/19 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
大学生村官工作感言
2014/01/10 职场文书
警察群众路线整改措施
2014/09/26 职场文书
售房协议书范本2014
2014/10/23 职场文书
世界红十字日活动总结
2015/02/10 职场文书
使用CSS连接数据库的方式
2022/02/28 HTML / CSS
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis
Python使用openpyxl模块处理Excel文件
2022/06/05 Python
详解CSS3浏览器兼容
2022/12/24 HTML / CSS