簡體   English   中英

Javascript數組差異

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

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