簡體   English   中英

如果另一個數組中不存在對象值,則從原始數組中刪除對象

[英]Removing an object from the original array if object value does not exist in another array

我僅在給定的usernamearr1arr2中不存在的情況下才嘗試從arr3刪除對象。

var arr1 = [{ id: 1, username: 'fred'}, 
            { id: 2, username: 'bill'},
            { id: 3, username: 'red'} ];

var arr2 = [{ id: 1, username: 'fred'},
            { id: 2, username: 'ted'},
            { id: 3, username: 'bed'} ];

var arr3 = [{ id: 1, username: 'fred'}, 
            { id: 2, username: 'zed'},
            { id: 3, username: 'zed'} ];


function removeElement(name){
    var found1 = arr1.some(function (element) {
        return element.username == name;  
    });
    var found2 = arr2.some(function (element){
        return element.username == name;
    });

    if (!found1 && !found2){
        for (var i = 0, n = arr3.length; i < n; i++){
            if (arr3[i].username == name){
                arr3.splice(i, 1);    
            }
        }
    }
};


removeElement('zed');

/*
Exception: TypeError: arr3[i] is undefined
removeElement@Scratchpad/6:24:1
@Scratchpad/6:32:1
*/

我得到這個TypeError,我假設是因為我在for循環期間更改了arr3的長度。 我可以在splice方法之后放置一個break語句,但是username不是唯一的,並且需要刪除arr3所有username: 'zed'的對象。

有什么方法可以通過直接更改原始數組arr3而不進行單獨復制來實現此目的?

您可以使用Set集合對象。
Mozilla開發人員網絡說:

Set對象使您可以存儲任何類型的唯一值,無論是原始值還是對象引用。

var toDeleteItem = new Set(['zed']);
arr3 = arr3.filter(
    // Strings are compared
    obj => !toDeleteItem.has(obj.username)
);

參見:« 與數組對象的關系 »

更改

if (!found1 && !found2){
    for (var i = 0, n = arr3.length; i < n; i++){
        if (arr3[i].username == name){
            arr3.splice(i, 1);    
        }
    }
}

if (!found1 && !found2){
    for (var i = arr3.length-1; i >= 0; i--){
        if (arr3[i].username == name){
            arr3.splice(i, 1);    
        }
    }
}

拼接時,您總是想以相反的順序進行操作,因為您縮短了數組,每次拼接時都說i = i + 2因為當前刪除的元素現在是列表中的下一個元素。

如果您發現它重復索引並檢查與undefined不同的值,那是更好的選擇。 我認為這是最簡單的,您不會在功能上增加更多復雜性

if (!found1 && !found2){
        for (var i = 0, n = arr3.length; i < n; i++){
          console.log(i);
          console.log(arr3)
            if ((typeof arr3[i] != 'undefined') && arr3[i].username == name){
                arr3.splice(i, 1);
                i--;
            }
        }
    }

函數式編程風格易於閱讀和理解。 請享用。 array#filter謂詞上的原始數組是,如果元素名稱存在於其他2個數組之一中,則將其刪除。

 var arr1 = [{ id: 1, username: 'fred'}, { id: 2, username: 'bill'}, { id: 3, username: 'red'} ]; var arr2 = [{ id: 1, username: 'fred'}, { id: 2, username: 'ted'}, { id: 3, username: 'bed'} ]; var arr3 = [{ id: 1, username: 'fred'}, { id: 2, username: 'zed'}, { id: 3, username: 'zed'} ]; var filtered = arr1.filter((person) => { return !( arr2.some((ele) => ele.username === person.username) || arr3.some((ele) => ele.username === person.username) ) }) console.log(filtered) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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