我有以下对象数组吗?
let arr1 = [{
id: 1,
props: []
}, {
id: 2,
props: []
}, {
id: 3,
props: []
}]
let arr2 = [{
id: 1,
props: ['a', 'b']
}, {
id: 3,
props: []
}]
我需要以某种方式比较这两个数组,并返回一个仅包含ID不在两个原始数组中的对象的新数组。因此,在上述情况下,它仅应包含ID为2的对象,因为它仅位于arr1中。
我尝试使用
let arr3 = _.differenceWith(arr1, arr2, _.isEqual)
只要对象中的props数组相似并且我不更改它(我仅在第二个数组中更改它),它就可以工作。
我也尝试过:
let arr3 = _.filter(arr1, o => o.id === _.find(arr2, obj2 => o.id === obj2.id))
但这根本不起作用。
有什么想法吗?
答案 0 :(得分:3)
您可以将_.differenceBy
与想要的键id
进行比较。
let array1 = [{ id: 1, props: [] }, { id: 2, props: [] }, { id: 3, props: [] }],
array2 = [{ id: 1, props: ['a', 'b'] }, { id: 3, props: [] }],
difference = _.differenceBy(array1, array2, 'id');
console.log(difference);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
答案 1 :(得分:0)
使用reduce
和Object.values
将会简化。
let arr1 = [
{
id: 1,
props: []
},
{
id: 2,
props: []
},
{
id: 3,
props: []
}
];
let arr2 = [
{
id: 1,
props: ["a", "b"]
},
{
id: 3,
props: []
}
];
const updated = Object.values(
[...arr1, ...arr2].reduce(
(acc, curr) =>
Object.assign(acc, { [curr.id]: curr.id in acc ? "" : { ...curr } }),
{}
)
).filter(x => x);
console.log(updated);