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 相关文章推荐
JavaScript delete操作符应用实例
Jan 13 Javascript
js导出table到excel同时兼容FF和IE示例
Sep 03 Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
javascript实现动态统计图开发实例
Nov 21 Javascript
js实现字符串和数组之间相互转换操作
Jan 12 Javascript
Node.js测试中的Mock文件系统详解
Nov 21 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
Apr 27 Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
Vue Promise的axios请求封装详解
Aug 13 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
Mar 05 Javascript
JS+canvas五子棋人机对战实现步骤详解
Jun 04 Javascript
详解JavaScript中的链式调用
Nov 27 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速度快类库
2007/03/31 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
进一步理解Python中的函数编程
2015/04/13 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
实例解析Python中的__new__特殊方法
2016/06/02 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
大学生自我鉴定范文模板
2014/01/21 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
意向书范文
2014/03/31 职场文书
计算机毕业生求职信
2014/06/10 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书