[英]Removing Multiple Objects from Javascript Array Breaks Half Way Through
我有幾百個JSON對象的數組......
var self.collection = [Object, Object, Object, Object, Object, Object…]
每個看起來像這樣......
0: Object
id: "25093712"
name: "John Haberstich"
我正在遍歷數組,搜索每個Array.id,以查看它是否與第二個Array中的任何ID匹配...
var fbContactIDs = ["1072980313", "2502342", "2509374", "2524864", "2531941"]
$.each(self.collection, function(index, k) {
if (fbContactIDs.indexOf(k.id) > -1) {
self.collection.splice(index, 1);
};
});
但是,此代碼僅用於從self.collection數組中拼接三個對象,然后它會斷開並給出以下錯誤:
Uncaught TypeError: Cannot read property 'id' of undefined
導致錯誤的行是這一行......
if (fbContactIDs.indexOf(k.id) > -1) {
有人能告訴我這里有什么問題嗎?
因為收集的長度會發生變化,所以訣竅就是從后向前循環
for (var index = self.collection.length - 1; index >= 0; index--) {
k = self.collection[index];
if (fbContactIDs.indexOf(k.id) > -1) {
self.collection.splice(index, 1);
};
}
迭代時,不應更改數組的長度。
你要做的是過濾,並且有一個特定的功能。 例如:
[1,2,3,4,5,6,7,8,9,10].filter(function(x){ return (x&1) == 0; })
只返回偶數。
在您的情況下,解決方案可能只是:
self.collection = self.collection.filter(function(k){
return fbContactIDs.indexOf(k.id) > -1;
});
或者,如果其他人保留對self.collection
的引用, self.collection
需要在其中進行self.collection
:
self.collection.splice(0, self.collection.length,
self.collection.filter(function(k){
return fbContactIDs.indexOf(k.id) > -1;
}));
如果出於某種原因,您希望一次處理一個元素而不是使用filter
而您需要就地執行此操作,則一種簡單的方法是讀寫方法:
var wp = 0; // Write ptr
for (var rp=0; rp<L.length; rp++) {
if (... i want to keep L[x] ...) {
L[wp++] = L[rp];
}
}
L.splice(wp);
從一個數組中一次刪除一個元素是一個O(n**2)
操作(因為對於你刪除的每個元素,所有下面的元素都必須向下滑動),讀寫方法是O(n)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.