簡體   English   中英

從Javascript數組中刪除多個對象突破了一半

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM