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)
祝你好运!
我有两个这样的数组
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)
祝你好运!