[英]Javascript array difference
我有兩個這樣的數組
data = [{id: 1, name: apple},
{id: 2, name: mango},
{id: 3, name: grapes},
{id: 4, name: banana}]
data2 =[{id: 1, name: apple},
{id: 3, name grapes}]
我的預期結果是:
[{ id: 2, name: mango},
{id:4, name: banana}]
我的代碼是
let finalData =[];
data.forEach(result => {
data2.find(datum => {
if(datum['id'] === result['id]{
finalData.push(result);
}
})
})
我得到錯誤的結果。 我可以使用的最簡單的代碼或庫是什么?
您的示例數據沒有意義,但假設您的意思是所有具有匹配 ID 的數據項也具有匹配的名稱,並且還假設您想要一組所有項目的集合,其中 ID 在兩組數據中相同,您可以使用Set
來跟蹤哪些 ID 存在於一個數組中,然后通過那些在集合中具有其 ID 的 ID 過濾第二個數組:
const idsInFirst = new Set(data.map(d => d.id));
const intersection = data2.filter(d => idsInFirst.has(d.id));
之所以使用中間Set
結構,是因為它允許在一次掃描后進行O(1)
查找,這比一遍又一遍地重復掃描第一個數組效率更高。
如果你想說你想要數據集(從data2
data
中排除的項目)之間的差異,你會想要否定/反轉一些東西:
const idsToExclude = new Set(data2.map(d => d.id));
const difference = data.filter(d => !idsToExclude.has(d.id));
編輯
在您澄清編輯之后,這是您需要的第二個代碼塊。
我會說一個很好的方法是使用一個函數來過濾最長的數組,該函數將驗證對象 id 是否存在於兩個數組中。 檢查這個例子:
const data = [ {id: 1, name: 'apple'}, {id: 2, name: 'mango'}, {id: 3, name: 'grapes'}, {id: 4, name: 'banana'} ] const data2 =[ {id: 1, name: 'apple' }, {id: 3, name: 'grapes' } ] const longest = data.length > data2.length ? data : data2; const shortest = data.length <= data2.length ? data : data2; const finalData = longest.filter( obj => !shortest.find( o => o.id === obj.id ) ) console.log(finalData)
祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.