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 判断客户端浏览器类型代码
Mar 01 Javascript
浅谈JavaScript函数参数的可修改性问题
Dec 05 Javascript
超链接怎么正确调用javascript函数
May 23 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
Mar 29 Javascript
详解如何在angular2中获取节点
Nov 23 Javascript
VUE重点问题总结
Mar 19 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
May 16 Javascript
基于Vue实现电商SKU组合算法问题
May 29 Javascript
JavaScript对象原型链原理解析
Jan 22 Javascript
redux处理异步action解决方案
Mar 22 Javascript
js实现上传按钮并显示缩略图小轮子
May 04 Javascript
JS的时间格式化和时间戳转换函数示例详解
Jul 27 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实现的随机红包算法示例
2017/08/14 PHP
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
Python实现获取操作系统版本信息方法
2015/04/08 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
python 网络爬虫初级实现代码
2016/02/27 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
Python三级菜单的实例
2017/09/13 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
python如何写try语句
2020/07/14 Python
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
交通事故协议书范文
2014/04/16 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
撤诉书怎么写
2015/05/19 职场文书
高三化学教学反思
2016/02/22 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电