按照某个属性取出两个对象数组不同的项,返回新数组

例如:

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')
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值