數組交集
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]