![](/img/trans.png)
[英]Removing object from one array if present in another array based on value
[英]Removing an object from the original array if object value does not exist in another array
我僅在給定的username
在arr1
和arr2
中不存在的情況下才嘗試從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.