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实现一些常用软件的下载导航
Aug 03 Javascript
IE6中使用position导致页面变形的解决方案(js代码)
Jan 09 Javascript
jQuery插件datepicker 日期连续选择
Jun 12 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
Sep 16 Javascript
node.js基于mongodb的搜索分页示例
Jan 22 Javascript
详解axios在node.js中的post使用
Apr 27 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
Jul 07 Javascript
underscore之Collections_动力节点Java学院整理
Jul 10 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
Sep 18 Javascript
vue生成token保存在客户端localStorage中的方法
Oct 25 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 jQuery
值得收藏的vuejs安装教程
Nov 21 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 向访客和爬虫显示不同的内容
2009/11/09 PHP
PHP通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
在Vue中使用antv的示例代码
2020/06/29 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
python 中的列表解析和生成表达式
2011/03/10 Python
win7安装python生成随机数代码分享
2013/12/27 Python
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python实现excel转sqlite的方法
2017/07/17 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
python操作yaml说明
2020/04/08 Python
使用python批量修改XML文件中图像的depth值
2020/07/22 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
诚信考试标语
2014/06/24 职场文书
感情真挚的毕业生求职信
2014/07/19 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
小学信息技术教学反思
2016/02/16 职场文书
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python