1. 程式人生 > >【微信小程式】for迴圈對陣列進行刪除時的坑

【微信小程式】for迴圈對陣列進行刪除時的坑

大家一定經歷過這種需求, 把一個數組(暫且稱之為list)的長度作為迴圈條件,迴圈過程中做一些判斷,然後刪除掉list中的某一項,或者多項。如以下程式碼:

let list = that.data.list;
for(let i = 0 ; i < list.length ; i++){
    if(list.checked){
	list.splice(i,1)
    }
}

注意:迴圈中,尤其是以陣列長度作為迴圈條件的,一定要小心一個陷阱,就是迴圈過程中對陣列進行增刪操作,很容易導致死迴圈或者執行次數不足,因為判斷條件(陣列長度)一直在變,所以不要在迴圈裡對條件陣列進行操作,或者不要以要被操作的陣列長度做判斷條件。

那麼該如何避免這個問題呢

我們需要對這段程式碼深入研究明白它為什麼會產生這樣的問題。

通過程式碼我們可以知道,產生這樣的原因是因為當陣列刪除一個元素的時候,陣列長度就會減一,後面的元素就會往前移動一位,相應的索引也減一,但是for迴圈還是進行了i++的動作。因此在每次進行了刪除的情況下,要對 i 進行減一。

解決辦法:

let list = that.data.list;
    for(let i = 0 ; i < list.length ; i++){
	if(list.checked){
		list.splice(i--,1)
    }
}
類似關於陣列元素進行刪除的,都要考慮陣列的長度會減一,後邊的元素會向前移動一位。