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 相关文章推荐
Chosen 基于jquery的选择框插件使用方法
May 30 Javascript
Javascript中匿名函数的多种调用方式总结
Dec 06 Javascript
AngularJs自定义服务之实现签名和加密
Aug 02 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
Nov 07 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
Jun 01 jQuery
js学习总结之DOM2兼容处理顺序问题的解决方法
Jul 27 Javascript
Ionic3实现图片瀑布流布局
Aug 09 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
Sep 18 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
Dec 21 Javascript
基于JS实现父组件的请求服务过程解析
Oct 14 Javascript
解决ele ui 表格表头太长问题的实现
Nov 13 Javascript
详谈vue中router-link和传统a链接的区别
Jul 22 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
C# Assembly类访问程序集信息
2009/06/13 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
python 图片验证码代码
2008/12/07 Python
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
Python API自动化框架总结
2019/11/12 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
汉语专业应届生求职信
2013/10/01 职场文书
文秘专业应届生求职信范文
2013/11/14 职场文书
20年同学聚会感言
2014/02/03 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
华清池导游词
2015/02/02 职场文书
工厂仓库管理员岗位职责
2015/04/09 职场文书
地道战观后感2000字
2015/06/04 职场文书