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 wmp操作代码小结(音乐连播功能)
Nov 08 Javascript
jQuery 表单验证扩展(四)
Oct 20 Javascript
JavaScript中的函数模式详解
Feb 11 Javascript
简单实现轮播图效果的实例
Jul 15 Javascript
将json转换成struts参数的方法
Nov 08 Javascript
详解Vue监听数据变化原理
Mar 08 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
Mar 30 Javascript
angular.extend方法的具体使用
Sep 14 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
Aug 26 Javascript
js实现带有动画的返回顶部
Aug 09 Javascript
JavaScript实现拖拽和缩放效果
Aug 24 Javascript
jquery插件懒加载的示例
Oct 24 jQuery
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
PHP4实际应用经验篇(5)
2006/10/09 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
批量实现面向对象的实例代码
2013/07/01 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
2019/05/15 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
Python Socket编程入门教程
2014/07/11 Python
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
Python多进程机制实例详解
2015/07/02 Python
python检索特定内容的文本文件实例
2018/06/05 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
Python多进程编程常用方法解析
2020/03/26 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
房地产销售计划书
2014/01/10 职场文书
班级读书活动总结
2014/06/30 职场文书
公务员个人总结
2015/02/12 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
实战Python爬虫爬取酷我音乐
2022/04/11 Python