繁体   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