發現問題數組
你們在碼代碼的過程當中,常常會遇到在循環中移除指定元素的需求。按照常規的思路,直接一個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爲數組下標,我的以爲這是最簡潔、高效的代碼實現了。