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 相关文章推荐
用于table内容排序
Jul 21 Javascript
XmlUtils JS操作XML工具类
Oct 01 Javascript
30个最好的jQuery 灯箱插件分享
Apr 25 Javascript
单击某一段文字改写文本颜色
Jun 06 Javascript
js基础知识(公有方法、私有方法、特权方法)
Nov 06 Javascript
怎么引入(调用)一个JS文件
May 26 Javascript
简单谈谈js的数据类型
Sep 25 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
Jan 14 Javascript
深入koa-bodyparser原理解析
Jan 16 Javascript
layui 表格操作列按钮动态显示的实现方法
Sep 06 Javascript
JS document文档的简单操作完整示例
Jan 13 Javascript
JavaScript 装逼指南(js另类写法)
May 10 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 模拟$_PUT实现代码
2010/03/15 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
PHP引用返回用法示例
2016/05/28 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
Script的加载方法小结
2011/01/12 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
vue中实现滚动加载更多的示例
2017/11/08 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
详解vue v-model
2020/08/31 Javascript
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
python 获取图片分辨率的方法
2019/01/08 Python
python定义类self用法实例解析
2020/01/22 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
django实现日志按日期分割
2020/05/21 Python
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
创建省级文明单位实施方案
2014/02/27 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python