js数组交集、并集、差集

数组交集

1. 利用filter + indexOf

var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN], arr2 = [1, 3, 5, NaN];
var intersection = arr1.filter(function (val) {
    return arr2.indexOf(val) > -1;
})
console.log(intersection);   // [1, 3, 5]

但这种方法针对是value值比较简单的Number(不包括NaN)、String、Boolean类型, 因为indexOf 本质上还是使用 === 来判断。

2. 利用ES6中 Array.from方法及Set

function intersect (a, b) {
    var bSet = new Set(b);
    return Array.from(a.filter(function (val) {
        return bSet.has(val);
    }));
}
var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN], arr2 = [1, 3, 5, NaN];
var intersection = intersect (arr1, arr2);
console.log(intersection);   // [1, 3, 5, NaN]

 可以解决NaN

3. 利用ES7中数组新增的includes + filter

var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN], arr2 = [1, 3, 5, NaN];
var intersection = arr1.filter(function (val) {
    return arr2.includes(val);
})
console.log(intersection);   // [1, 3, 5, NaN]

 数组并集

1. 利用filter + indexOf

var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN], arr2 = [1, 3, 5, NaN];
var union= arr1.concat(arr2.filter(function (val) {
    return arr1.indexOf(val) === -1;
}))
console.log(union);  // [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN, NaN]

2. 利用ES6中 Array.from方法及Set

var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN], arr2 = [1, 3, 5, NaN];
var union= Array.from(new Set(arr1.concat(arr2)));
console.log(union);   // [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN]

3. 利用ES7中新增的includes + filter

var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN], arr2 = [1, 3, 5, NaN];
var union= arr1.concat(arr2.filter(function (val) {
    return !arr1.includes(val)
}));
console.log(union);   // [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN]

 数组差集

1. 利用filter + indexOf

var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN], arr2 = [1, 3, 5, NaN];
var difference = arr1.filter(function (val) {
    return arr2.indexOf(val) === -1;
}).concat(arr2.filter(function (val) { 
    return arr1.indexOf(val) === -1 
}));
console.log(difference);  //  [2, 4, 6, 7, 8, 9, NaN, NaN]

2. 利用ES6中 Array.from方法及Set

function difference (a, b) {
    var aSet = new Set(a), bSet = new Set(b);
    return Array.from(new Set(a.concat(b).filter(function (val) {
        return !aSet.has(val) || !bSet.has(val)
    })))
}
var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN], arr2 = [1, 3, 5, NaN];
var differenceVal = difference (arr1, arr2);
console.log(differenceVal );  //  [2, 4, 6, 7, 8, 9]

3. 利用ES7中新增的includes + filter

var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, NaN], arr2 = [1, 3, 5, NaN];
var difference = arr1.concat(arr2).filter(function (val) {
    return  !a.includes(val) || !b.includes(val)
});
console.log(difference);  // [2, 4, 6, 7, 8, 9]

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值