js 差集

let arr1 = [1,2,3,4,5]

let arr2 = [3,4,6,7]

差集

方法一

function difference(arr1, arr2) {
    let diff = [];
    let tmp = arr2;
    arr1.forEach((val1, i) => {
        if (arr2.indexOf(val1) < 0) {
           diff.push(val1);
        } else {
           tmp.splice(tmp.indexOf(val1), 1);
        }
    });
    return diff.concat(tmp)
}
console.log(
difference(arr1, arr2)) // [1,2,5,6,7]

方法二

ES6中新增的一个Array.from方法,用于将类数组对象和可遍历对象转化为数组,结合Set结构

let aSet = new Set(arr1)
let bSet = new Set(arr2)
let difference = Array.from(new Set(arr1.concat(arr2).filter(v => !aSet.has(v) || !bSet.has(v)))) // [1,2,5,6,7]

分析:

1. 先使用 set结构 对数组自身去重,并保存起来,这时保存的是set对象

2. arr1.concat(arr2)  把两个数组合并,再使用 filter 过滤

3.  v => !aSet.has(v) || !bSet.has(v) 过滤条件

aSet和bSet都是set对象,可以使用has过滤 (has() 方法返回一个布尔值来指示对应的值value是否存在Set对象中。)

"!aSet.has(v)  ||  !bSet.has(v) "这里取 ‘!非’ 和 ‘ || 或’  是为了过滤同时存在两个数组的值 

4. 再使用 "new Set()" 去重

5. 使用"Array.from" 把Set对象 转化为数组

 

参考链接: https://blog.csdn.net/qq_35430000/article/details/88046136

js 差集

上一篇:探索Oracle之 EXP/IMP过程中的字符集问题


下一篇:JS基础03—for循环 和 forEach的区别