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将相对地址转换为绝对地址示例代码
Jul 19 Javascript
浅析document.ready和window.onload的区别讲解
Dec 18 Javascript
javascript的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
jQuery给多个不同元素添加class样式的方法
Mar 26 Javascript
纯JS实现旋转图片3D展示效果
Apr 12 Javascript
jQuery实现移动端Tab选项卡效果
Mar 15 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
Apr 26 Javascript
js实现左右两侧浮动广告
Jul 09 Javascript
angular4+百分比进度显示插件用法示例
May 05 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
Aug 16 Javascript
vue把输入框的内容添加到页面的实例讲解
Nov 11 Javascript
JavaScript控制台的更多功能
Apr 28 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下将XML转换为数组
2010/01/01 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
2016/07/28 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
用 JSON 处理缓存
2007/04/27 Javascript
List the UTC Time on a Computer
2007/06/11 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
Python 远程开关机的方法
2020/11/18 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
阳光体育活动总结
2014/04/30 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
新郎新娘答谢词
2015/01/04 职场文书
兵马俑导游词
2015/02/02 职场文书
花田少年史观后感
2015/06/16 职场文书
教师见习总结范文
2015/06/23 职场文书
《女娲补天》教学反思
2016/02/20 职场文书