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 相关文章推荐
用javascript获得地址栏参数的两种方法
Nov 08 Javascript
原生JavaScript制作计算器
Oct 16 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
Aug 31 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
Jan 02 jQuery
vue项目动态设置页面title及是否缓存页面的问题
Nov 08 Javascript
Vue 表情包输入组件的实现代码
Jan 21 Javascript
vue 插件的方法代码详解
Jun 06 Javascript
微信小程序登陆注册功能的实现代码
Dec 10 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
May 09 Javascript
vue实现数字滚动效果
Jun 29 Javascript
微信小程序实现通讯录列表展开收起
Nov 18 Javascript
jQuery实现动态向上滚动
Dec 21 jQuery
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
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
javascript断点调试心得分享
2016/04/23 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
Element input树型下拉框的实现代码
2018/12/21 Javascript
用Node写一条配置环境的指令
2019/11/14 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
[40:16]TFT vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
django之常用命令详解
2016/06/30 Python
带你了解python装饰器
2017/06/15 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
安全教育实施方案
2014/03/02 职场文书
法制报告会主持词
2014/04/02 职场文书
售房协议书范本2014
2014/10/23 职场文书
教师个人发展总结
2015/02/11 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL