js数组交集、并集、差集

it2025-04-15  5

数组交集

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]

 

最新回复(0)