我有兩個陣列:
例如:
arraySelectedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]
arraySavedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]
現在我需要檢查 arraySavedItems 中是否有某些專案不存在于 arraySelectedItems 中,在這種情況下,我將去填充另一個名為 arrayDeletedItems 的陣列。
如果兩個陣列具有相同的專案,我不需要填充 arrayDeletedItems。
所以我試過這段代碼:
arraySavedItems.filter((itemSaved) => !arraySelectedItems.find((itemSel) => {
if (itemSaved.id !== itemSel.id) {
arrayDeletedItems.push(itemSaved)
}
}
))
所以有了這個資料:
arraySelectedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]
arraySavedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]
我希望 arrayDeletedItems 將是:
arrayDeletedItems = []
取而代之的是這個資料,例如:
arraySelectedItems = [{id: 1, name: "item1"}]
arraySavedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]
我希望 arrayDeletedItems 將是:
arrayDeletedItems = [{id: 2, name: "item2"}]
使用我的代碼,我收到了具有所有值的 arrayDeletedItems:
arrayDeletedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]
uj5u.com熱心網友回復:
考慮這個通用函式:
function difference(a, b, keyFn) {
let keys = new Set(a.map(keyFn))
return b.filter(obj => !keys.has(keyFn(obj)))
}
//
selectedItems = [{id: 1, name: "item1"}, {id:4}]
savedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}, {id:3}, {id:4}]
result = difference(selectedItems, savedItems, obj => obj.id)
console.log(result)
uj5u.com熱心網友回復:
您可以.includes()在陣列上使用該方法來檢查其中是否包含一個值(有關詳細資訊,請參閱檔案)。
現在我們可以過濾已保存專案的陣列以僅查找所選專案陣列中未包含的專案。
arrayDeletedItems = arraySavedItems.filter((itemSaved) =>
!arraySelectedItems.includes(itemSaved)
)
uj5u.com熱心網友回復:
解決這個問題,既然有了id就可以利用。您需要一個唯一的密鑰。如此id廣為人知將具有獨特的價值。
所以我的方法是,找到 B 陣列中不存在但在 A 陣列中的專案,并找到 B 中存在但 A 陣列中不存在的專案。
這種方法不是最快的,但findDiff可以重復使用。
const a = [....];
const b = [....];
const findDiff = (source, target) => {
return source.filter((sourceItem, index) => {
const isInTarget = target.findIndex(targetItem => targetItem.id === sourceItem.id)
return isInTarget === -1
})
}
const difference = findDiff(a,b).concat(findDiff(b,a)); //result
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/535830.html
標籤:javascript
