JS逆序遍历实现代码
作者:bea
最常用的遍历方式为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]); } 这就是最常用的遍历方式:正序遍历。它从数组的第一项依次走到最后一项。 那为什么今天小剧还会提到逆序遍历呢? 这里不得不提下小剧写的组件里
最常用的遍历方式为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。
好吧,我承认今天写的东西很屌丝,但通过这个例子,给以后写代码的时候提了个醒,在遍历过程中,如果涉及到修改数组本身(增删),逆序遍历是个比较保险的遍历方式。
coding笔记,留给以后嘲笑自己!
转载请注明来源:http://bh-lay.com/blog/148c07761fa
有用 | 无用
代码如下:
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。
好吧,我承认今天写的东西很屌丝,但通过这个例子,给以后写代码的时候提了个醒,在遍历过程中,如果涉及到修改数组本身(增删),逆序遍历是个比较保险的遍历方式。
coding笔记,留给以后嘲笑自己!
转载请注明来源:http://bh-lay.com/blog/148c07761fa
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- 用js读、写、删除Cookie代码续篇
- 基于jquery实现等比缩放图片
- javascript简单实现图片预加载
- 3种Jquery限制文本框只能输入数字字母的方法
- javascript引擎长时间独占线程造成卡顿的解决方案
- javascript中clone对象详解
- javascript使用正则表达式检测IP地址
- Javascript快速排序算法详解
- Javascript冒泡排序算法详解
- Javascript堆排序算法详解
- node.js下when.js 的异步编程实践
- nodejs下打包模块archiver详解
- jquery操作 iframe的方法
- 使用js实现数据格式化
- 使用js获取图片原始尺寸
- 上传文件返回的json数据会被提示下载问题解决方案
- 使用jQuery实现验证上传图片的格式与大小
- 使用正则表达式的格式化与高亮显示json字符串
- jquery中获取元素里某一特定子元素的代码