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 相关文章推荐
jQuery 改变CSS样式基础代码
Feb 11 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
May 03 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
Jun 21 Javascript
Mvc提交表单的四种方法全程详解
Aug 10 Javascript
angular-ui-sortable实现可拖拽排序列表
Dec 28 Javascript
Javascript中的神器——Promise
Feb 08 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
Feb 22 Javascript
纯JS实现弹性导航条效果
Mar 06 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
Apr 13 Javascript
Bootstrap Multiselect 常用组件实现代码
Jul 09 Javascript
JavaScript实现简单生成随机颜色的方法
Sep 21 Javascript
对vue下点击事件传参和不传参的区别详解
Sep 15 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 strtr() 函数使用说明
2008/11/21 PHP
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
php修改时间格式的代码
2011/05/29 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
PHP中list方法用法示例
2016/12/01 PHP
解决php-fpm.service not found问题的办法
2017/06/06 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
js实现图片360度旋转
2017/01/22 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
python检测某个变量是否有定义的方法
2015/05/20 Python
python实现批量改文件名称的方法
2015/05/25 Python
Python分治法定义与应用实例详解
2017/07/28 Python
Python实现学校管理系统
2018/01/11 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
党员实事承诺书
2014/03/26 职场文书
中学生励志演讲稿
2014/04/26 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
小浪底导游词
2015/02/12 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
Python时间操作之pytz模块使用详解
2022/06/14 Python
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android