按照某个属性取出两个对象数组不同的项,返回新数组
例如:
let a = [{label:'第一个', value: 100},{label:'第二个', value: 200},{label:'第三个', value: 300}]
let b = [{label:'第三个', value: 300},{label:'第四个', value: 400},{label:'第五个', value: 500}]
开始想法是用原生js
第一步:先取两个数组的交集
// 按照某个属性取交集,这里取value相同的项为交集
let e = a.filter(i => b.some(j => j.value === i.value))
// e = [{label:'第三个', value: 300}]
第二步: 取两个数组的并集,并且过滤掉第一步取得的交集
let f = a.concat(b).filter(v => e.some(n => n.value !== v.value))
// f = [{label:'第一个', value: 100}, {label:'第二个', value: 200}, {label:'第四个', value: 400}, {label:'第五个', value: 500}]
最后得到的数组 f 就是包含两个数组中value属性值不同的所有项的数组
后来看到lodash库中有个differentceBy方法,更加的简便
https://www.html.cn/doc/lodash/#_differencebyarray-values-iteratee_identity
let f = differenceBy(a,b,'value').concat(differenceBy(b,a,'value'))
这个方法可以直接得到一个含有两个数组中所有value属性值不同的项的数组
两种不同的地方在于,第一种方式属于原生js,更加易于理解,第二种方式直接使用封装好的方法,更简便美观
有一种情况, 当对象数组中的元素对象含有多级时,使用后一种方法更加的简单
例如:
let a = [{label:'第一个', value: 100, children: {label:'二级',value:1},{label:'第二个', value: 200,children: {label:'二级',value:2}}]
若要再对比children不同,很明显第二种方式改变需要迭代的属性即可
let f = differenceBy(a,b,'children')