JS数组求并集,交集和差集

Love The Way You Lie 2022-05-11 08:52 364阅读 0赞

es7: filter结合includes

  1. // 并集
  2. let union = a.concat(b.filter(v => !a.includes(v))) // [1,2,3,4,5]
  3. // 交集
  4. let intersection = a.filter(v => b.includes(v)) // [2]
  5. // 差集
  6. let difference = a.concat(b).filter(v => !a.includes(v) || !b.includes(v)) // [1,3,4,5]

es6: set数据结合Array.form

  1. let aSet = new Set(a)
  2. let bSet = new Set(b)
  3. // 并集
  4. let union = Array.from(new Set(a.concat(b))) // [1,2,3,4,5]
  5. // 交集
  6. let intersection = Array.from(new Set(a.filter(v => bSet.has(v)))) // [2]
  7. // 差集
  8. let difference = Array.from(new Set(a.concat(b).filter(v => !aSet.has(v) || !bSet.has(v)))) // [1,3,4,5]

ES5可以利用filter和indexOf进行数学集操作,但是,由于indexOf方法中NaN永远返回-1,所以需要进行兼容处理。

  1. // 不考虑NaN(数组中不含NaN)
  2. // 并集
  3. var union = a.concat(b.filter(function(v) {
  4. return a.indexOf(v) === -1})) // [1,2,3,4,5]
  5. // 交集
  6. var intersection = a.filter(function(v){ return b.indexOf(v) > -1 }) // [2]
  7. // 差集
  8. var difference = a.filter(function(v){ return b.indexOf(v) === -1 }).concat(b.filter(function(v){ return a.indexOf(v) === -1 })) // [1,3,4,5]
  9. //考虑NaN
  10. var aHasNaN = a.some(function(v){ return isNaN(v) })
  11. var bHasNaN = b.some(function(v){ return isNaN(v) })
  12. // 并集
  13. var union = a.concat(b.filter(function(v) {
  14. return a.indexOf(v) === -1 && !isNaN(v)})).concat(!aHasNaN & bHasNaN ? [NaN] : []) // [1,2,3,4,5]
  15. // 交集
  16. var intersection = a.filter(function(v){ return b.indexOf(v) > -1 }).concat(aHasNaN & bHasNaN ? [NaN] : []) // [2]
  17. // 差集
  18. var difference = a.filter(function(v){ return b.indexOf(v) === -1 && !isNaN(v) }).concat(b.filter(function(v){ return a.indexOf(v) === -1 && !isNaN(v) })).concat(aHasNaN ^ bHasNaN ? [NaN] : []) // [1,3,4,5]

发表评论

表情:
评论列表 (有 0 条评论,364人围观)

还没有评论,来说两句吧...

相关阅读