JS数组取交集、并集
简单数组
如果数组中仅是字符串和数值
es5
var a =[1,2,3], b =[2,3,4,5];
// 交集---[2,3]
var intersection =  a.filter(item => b.indexOf(item)>-1)
// 并集---[1,2,3,4,5]
var union= a.concat(b.filter(item => a.indexOf(item)===-1))
交集的逻辑就是将b在a⾥边过滤⼀下,只需要a⾥边不到的即可。并集的逻辑类似,使⽤concat⽅法将a⾥边没有的数据合并到a⾥边,因此在过滤b的时候要判断a⾥边能不能到索引。
es6
var a =[1,2,3], b =[2,3,4,5];
// 交集---[2,3]
var intersection =a.filter(item =>new Set(b).has(item))
// 并集---[1,2,3,4,5]
var union= Array.from(new Set([...a,...b]))
这⾥使⽤了es6语法中的,其类似于数组,但成员都是唯⼀,因此很⽅便与去重。⽽且还能够使⽤其内置的⽅法。
在获取并集的时候,使⽤了数组的from⽅法,将set类型转为数组。
数组对象
var c =[{id:1, name:'jack'},{id:2, name:'bob'}];
var d =[{id:2, name:'bob'},{id:3, name:'Jessica'}];
// 交集---[{id: 2, name: 'bob'}]
var intersection =[];
for(let i =0; i< c.length; i++){
for(let j =0; j< d.length; j++){
if(c[i].id === d[j].id){
intersection.push(c[i])
}
}
}
filter过滤对象数组
// 并集
var union =[...c,...d]
for(let i =0; i< c.length; i++){
for(let j =0; j< d.length; j++){
if(c[i].id === d[j].id){
union1.splice(union1.findIndex(item =>{return c[i].id === item.id}),1)
}
}
}
交集的逻辑是双重循环去判断对象内的唯⼀值是否相等,然后将相等的数据放到数组中。并集的逻辑类似,也是双重循环去判断⼆者,但是在刚开始就将两个数组进⾏展开,因此在判断两者有⼀样的数据时,要通过splice⽅法去删除当前值。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。