发现问题数组
你们在码代码的过程当中,常常会遇到在循环中移除指定元素的需求。按照常规的思路,直接一个for循环,而后在循环里面来个if判断,在判断中删除掉指定元素便可。可是实际状况每每不会像预想的那样顺利运行。spa
下面以一段Javascript代码为例演示这一过程。.net
1
2
3
4
5
6
7
8
9
10
11
12
13
|
(
function
() {
var
arr = [1,2,2,3,4,5];
var
len = arr.length;
for
(
var
i=0;i<len;i++){
//打印数组中的状况,便于跟踪数组中数据的变化
console.log(i+
"="
+arr[i]);
//删除掉全部为2的元素
if
(arr[i]==2){
arr.splice(i,1);
}
}
console.log(arr);
})();
|
运行结果以下:code
从最终的结果能够看到实际上只删除掉了匹配的其中一个元素,而另一个元素还存在。htm
从打印出的运行过程不难发现,缘由为当删除掉了一个元素后,数组的索引起生的变化,形成了程序的异常。索引
解决方法ip
找到了问题的缘由,就不难解决问题了。ci
方法一get
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
(
function
() {
var
arr = [1,2,2,3,4,5];
var
len = arr.length;
for
(
var
i=0;i<len;i++){
//打印数组中的状况,便于跟踪数组中数据的变化
console.log(i+
"="
+arr[i]);
//删除掉全部为2的元素
if
(arr[i]==2){
//注意对比这行代码:删除元素后调整i的值
arr.splice(i--,1);
}
}
console.log(arr);
})();
|
上面的代码看起来不大好理解,有没有看起来更易于理解的代码呢?请看下面string
方法二
1
2
3
4
5
6
7
8
9
10
11
12
|
(
function
() {
var
arr = [1,2,2,3,4,5];
var
len = arr.length-1;
//start from the top
for
(
var
i=len;i>=0;i--){
console.log(i+
"="
+arr[i]);
if
(arr[i]==2){
arr.splice(i,1);
}
}
console.log(arr);
})();
|
从后往前遍历能够有效解决问题,也容易理解,那么还有没有跟简洁的实现呢?接着看下面代码
方法三
1
2
3
4
5
6
7
8
9
10
11
|
(
function
() {
var
arr = [1,2,2,3,4,5];
var
i = arr.length;
while
(i--){
console.log(i+
"="
+arr[i]);
if
(arr[i]==2){
arr.splice(i,1);
}
}
console.log(arr);
})();
|
使用while(i--)
,i为数组下标,我的以为这是最简洁、高效的代码实现了。