一般for循环
1 | (function() { |
运行结果如下:
1 | 0=1 |
从结果来看实际上只删除掉了其中一个匹配的2元素,而另外一个元素还存在。
原因在于当删除掉了一个元素后,数组的索引发生的变化,造成了程序的异常。
解决方案
删除元素的同时调整遍历索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17(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);
})();反向遍历删除元素
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 - 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);
})();使用while循环
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);
})();循环过程中设立flag标志,并在后面的 i++ 位置判断,flag为true则加,为false则不变。特别注意,for循环里面的 if 要先判断一下 arr[i] 的存在与否。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16(function() {
var arr = [1, 2, 2, 3, 4, 5];
var len = arr.length,
i = 0,
flag = true;
for (; i < len; flag ? i++ : i) {
console.log(i + "=" + arr[i]);
if (arr[i] && arr[i] == 2) {
arr.splice(i, 1);
flag = false;
} else {
flag = true;
}
}
console.log(arr);
})();