如何使用lodash通过单个属性过滤/比较2个对象数组?

时间:2020-02-18 07:42:04

标签: javascript arrays lodash

我有以下对象数组吗?

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))

但这根本不起作用。

有什么想法吗?

2 个答案:

答案 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)

使用reduceObject.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);