JS求陣列的交集、並集、差集

水果哥發表於2018-11-18

現有兩個陣列

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的問題,用到的話需要注意。

相關文章