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 的那些来过滤第二个数组:

const idsInFirst = new Set(data.map(d => d.id));
const intersection = data2.filter(d => idsInFirst.has(d.id));

之所以使用中间Set结构是因为它允许在一次扫描后进行O(1)查找,这比一遍又一遍地重复扫描第一个数组更有效。

如果您想说您想要数据集之间的 差异data2 中排除在 data 之外的项目),您需要对negate/inverse事情有点:

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)

祝你好运!