現有兩個陣列
let a = [101,201,601]
let b = [201,301,801]
複製程式碼
1.求交集(交集元素由既屬於集合a又屬於集合b的元素組成)
方法1
let intersection = a.filter(v => b.includes(v)) // [201]
複製程式碼
方法2
let intersection = Array.from(new Set(a.filter(v=> new Set(b).has(v))))
// [201]
複製程式碼
方法3
let intersection = a.filter(v => new Set(b).has(v)) // [201]
複製程式碼
方法4
let intersection = a.filter(function(v) { return b.indexOf(v) > -1 }) // [201]
複製程式碼
過濾重複資料
如果陣列中存在重複資料,也可用下面的方法去重:
let a = [101,201,601,201]
let b = [201,301,801]
let intersection = a.filter(function(v) {
return b.indexOf(v) > -1
}).filter(function (e,i,c) {
return c.indexOf(e) === i
}) // [201]
複製程式碼
方法5
let intersection = []
a.forEach(function (item) {
b.forEach(function(v) {
if (item === v) {
intersection.push(v)
}
})
}) // [201]
複製程式碼
總結: 如果陣列中有重複資料,方法1、3、4、5會有重複資料出現
2.求並集 (並集元素由集合a和集合b中所有元素去重組成)
方法1
let union = a.concat(b.filter(v=> {
return !a.includes(v)
}
)) // [101, 201, 601, 301, 801]
複製程式碼
方法2
let union = Array.from(new Set(a.concat(b))) // [101, 201, 601, 301, 801]
複製程式碼
方法3
let union = a.concat(b.filter(function(v) {
return a.indexOf(v) === -1
})) // [101, 201, 601, 301, 801]
複製程式碼
總結: 方法2寫法最簡單
3.求差集 (差集元素由集合a和集合b的並集減去集合a和集合b的交集)
方法1
let difference = a.concat(b).filter(v => !a.includes(v) || !b.includes(v))) // [101, 601, 301, 801]
複製程式碼
方法2
let difference = Array.from(new Set(a.concat(b).filter(
v => !new Set(a).has(v) || !new Set(b).has(v)
))) // [101, 601, 301, 801]
複製程式碼
方法3
let difference = a.filter(function(v) {
return b.indexOf(v) === -1
}).concat(b.filter(function(v) {
return a.indexOf(v) === -1
})) // [101, 601, 301, 801]
複製程式碼
總結: 方法1寫法最優。indexOf有個對NaN返回-1的問題,用到的話需要注意。