2012-08-14 37 views
2

我想遍歷對象的數組,並根據某些條件刪除其中的一些。如何通過迭代對象數組來刪除某些項目?

我使用拼接刪除項目,以保持項目的有序計數。

然後每次刪除項目我會減少計數。

但由於某些原因它永遠不會奏效:

var arr=[{img:1},{img:2},{img:3},{img:4}]; 
for (var i=0, count= arr.length; i < count;) { 
    if (this.arr[i].img==3) { 
     this.arr.splice(i,1); 
     count--; 
    }else i++ 
}; 
alert(JSON.stringify(arr)); 

...任何想法?

+0

我認爲['Array.filter'(http://www.tutorialspoint.com/javascript/array_filter.htm)是你所需要的 – mgibsonbr 2012-08-14 01:31:45

+0

我不知道'Array'的事情將在IE8工作。我會仔細看看的。 – Anonymous 2012-08-14 01:32:57

+0

順便說一句你的方法對我來說工作得很好。唯一的問題是'this.arr'(你是不是隻是'arr',因爲你用'var'聲明瞭它?) – mgibsonbr 2012-08-14 01:34:46

回答

2

Looping backwards應該做的伎倆。這可避免使用計數器並在由於「退避」值而刪除條目時重置計數器。

var i; 
for (i = arr.length; i--;) { 
    if (arr[i].img === 3) { 
     arr.splice(i, 1); 
    } 
}; 
+1

謝謝,我永遠不會想到這一點。我認爲雖然它應該是'arr.length-1',否則它可能會因爲不存在索引而被竊聽 – Anonymous 2012-08-14 01:40:39

+2

@Anonymous實際上它很好。 for-loops在執行塊之前評估第二部分(條件部分)。所以在一個4的數組中,由於'i - '作爲條件,'i'在塊開始時變爲3。 – Joseph 2012-08-14 01:43:18

+0

這很好。 – Anonymous 2012-08-14 01:48:15

0

我已經處理過這個相同的難度。我的解決方案是循環訪問數組,並編寫另一個要移除的元素數組。循環遍歷元素列表以反向刪除並刪除它們。這對我很好。

邁克爾G.

0

你指的是this.arr,而不是僅僅arr

從代碼中刪除兩個this.,它的工作原理。 :-)

1

通過數組向後簡單的循環,那麼你不必調整迭代器:

var i = arr.length; 
while (i--) { 

    if (arr[i].img == 3) { 
    arr.splice(i,1); 
    } 
} 
0

嘗試這個循環中,我還沒有測試,但應該工作。

var arr=[{img:1},{img:2},{img:3},{img:4}]; 
for (var i=arr.length-1; i >= 0; i--) { 
    if (arr[i].img==3) { 
     arr.splice(i,1); 
    } 
}; 
alert(JSON.stringify(arr));