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 09 Javascript
页面回到顶部的三种实现(锚标记,js)
Oct 01 Javascript
jQuery 关于伪类选择符的使用说明
Apr 24 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
jQuery DOM操作实例
Mar 05 Javascript
jQuery属性选择器用法示例
Sep 09 Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 Javascript
js实现加载页面就自动触发超链接的示例
Aug 31 Javascript
深入理解Vue router的部分高级用法
Aug 15 Javascript
vue  elementUI 表单嵌套验证的实例代码
Nov 06 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
Jul 17 Javascript
详解ES6 扩展运算符的使用与注意事项
Nov 12 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/01/18 PHP
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
php微信公众号开发之简答题
2018/10/20 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
[01:08]DOTA2“血战之命”预告片
2017/08/12 DOTA
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
python super函数使用方法详解
2020/02/14 Python
详解Python中namedtuple的使用
2020/04/27 Python
Python 如何反方向迭代一个序列
2020/07/28 Python
python中四舍五入的正确打开方式
2021/01/18 Python
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
十佳大学生村官事迹
2014/01/09 职场文书
幼儿园英语教学反思
2014/01/30 职场文书
保密协议书范本
2014/04/22 职场文书
增员口号大全
2014/06/18 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
授权委托书协议书
2014/10/16 职场文书
学籍证明模板
2014/11/21 职场文书
国庆阅兵观后感
2015/06/15 职场文书
导游词之青城山景区
2019/09/27 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫