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