JavaScript 从浅入深 100 题训练计划--(22)数组交集 / 并集 / 差集
intersection([1,2,3], [2,3,4]) // [2,3]
union([1,2,3], [2,3,4]) // [1,2,3,4]
difference([1,2,3], [2,3,4]) // [1]
1 const A = [1, 2, 3, 4, 5]; 2 const B = [4, 5, 6, 7, 8]; 3 4 function intersection(arr1, arr2) { 5 const list = new Set(arr2); 6 return arr1.filter(item => list.has(item)) 7 } 8 9 function union(arr1, arr2) { 10 return [...new Set([...arr1, ...arr2])] 11 } 12 13 // 不去重的版本 14 const result1 = A.filter(item => new Set(B).has(item)); 15 // [4, 5] ← 正好没重复,但如果 A = [1,1,2,4,5],会返回 [1,1,4,5] 16 17 // 去重的版本(结果也是 Set) 18 function intersectionUnique(arr1, arr2) { 19 const set2 = new Set(arr2); 20 return [...new Set(arr1.filter(item => set2.has(item)))]; 21 } 22 23 24 function difference(arr1, arr2) { 25 const list = new Set(arr2); 26 return arr1.filter(item => !list.has(item)) 27 } 28 29 function symmetricDifference(arr1, arr2) { 30 const list1 = new Set(arr1) 31 const list2 = new Set(arr2) 32 33 return [ 34 ...arr1.filter(item => !list2.has(item)), 35 ...arr2.filter(item => !list1.has(item)), 36 ] 37 } 38 39 class ArraySet { 40 // 交集 41 static intersection(...arrays) { 42 if (arrays.length === 0) return []; 43 return arrays.reduce((a, b) => a.filter(x => b.includes(x))); 44 } 45 46 // 并集 47 static union(...arrays) { 48 return [...new Set(arrays.flat())]; 49 } 50 51 // 差集 (a - b) 52 static difference(arr1, arr2) { 53 const set2 = new Set(arr2); 54 return arr1.filter(x => !set2.has(x)); 55 } 56 57 // 对称差集 58 static symmetricDifference(arr1, arr2) { 59 return [ 60 ...arr1.filter(x => !arr2.includes(x)), 61 ...arr2.filter(x => !arr1.includes(x)) 62 ]; 63 } 64 65 // 判断是否子集 66 static isSubset(arr1, arr2) { 67 const set2 = new Set(arr2); 68 return arr1.every(x => set2.has(x)); 69 } 70 } 71 72 console.log(intersection(A, B), 'key', union(A, B), result1, intersectionUnique(A, B), difference(A, B), difference(B, A), symmetricDifference(A, B))

浙公网安备 33010602011771号