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 相关文章推荐
JS option location 页面跳转实现代码
Dec 27 Javascript
JavaScript常用函数工具集:lao-utils
Mar 01 Javascript
jQuery Ajax页面局部加载方法汇总
Jun 02 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
Jun 30 Javascript
jQuery基础_入门必看知识点
Jul 04 Javascript
angularJS之$http:与服务器交互示例
Mar 17 Javascript
jQuery插件开发发送短信倒计时功能代码
May 09 jQuery
关于webpack代码拆分的解析
Jul 20 Javascript
Vue弹出菜单功能的实现代码
Sep 12 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 Javascript
JavaScript实现英语单词题库
Dec 24 Javascript
Echarts.js无法引入问题解决方案
Oct 30 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删除HTMl标签的实现代码
2013/06/30 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
JQuery中ajax方法访问web服务实例
2015/07/18 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
vue实现手机端省市区区域选择
2019/09/27 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
python私有属性和方法实例分析
2015/01/15 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
中考冲刺决心书
2014/03/11 职场文书
教职工代表大会主持词
2014/04/01 职场文书
离职保密承诺书
2014/05/28 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android