數組
- 直接使用filter、concat
var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
//交集
var c = a.filter(function(v){ return b.indexOf(v) > -1 })
//差集
var d = a.filter(function(v){ return b.indexOf(v) == -1 })
//補集
var e = a.filter(function(v){ return !(b.indexOf(v) > -1) })
.concat(b.filter(function(v){ return !(a.indexOf(v) > -1)}))
//並集
var f = a.concat(b.filter(function(v){ return !(a.indexOf(v) > -1)}));
//a與b的交集c: [2, 4]
//a與b的差集d: [1, 3, 5]
//a與b的補集e: [1, 3, 5, 6, 8, 10]
//a與b的並集f: [1, 2, 3, 4, 5, 6, 8, 10]
- ES6語法
var a = [1,2,3,4,5]
var b = [2,4,6,8,10]
console.log("數組a:", a);
console.log("數組b:", b);
var sa = new Set(a);
var sb = new Set(b);
// 交集
let c= a.filter(x => sb.has(x));
// 差集
let d= a.filter(x => !sb.has(x));
// 補集
let e= [...a.filter(x => !sb.has(x)), ...b.filter(x => !sa.has(x))];
// 並集
let f= Array.from(new Set([...a, ...b]));
//a與b的交集c: [2, 4]
//a與b的差集d: [1, 3, 5]
//a與b的補集e: [1, 3, 5, 6, 8, 10]
//a與b的並集f: [1, 2, 3, 4, 5, 6, 8, 10]
數組對象
- 直接用ES6語法會少很多代碼
let a=[{id:1,a:123,b:1234},{id:2,a:123,b:1234},{id:5,a:123,b:1234}];
let b=[{id:1,a:123,b:1234},{id:2,a:123,b:1234},{id:3,a:123,b:1234},{id:4,a:123,b:1234}];
//取交集
let c= [...b].filter(x => [...a].some(y => y.id === x.id));
//取差集
let d= [...b].filter(x => [...a].every(y => y.id !== x.id));
// 補集(這里是將兩個交集相加了)
let d1= [...a].filter(x => [...b].every(y => y.id !== x.id));
let e = d.concat(d1);
// 並集(交集+補集)
let f = c.concat(e);
//a與b的交集c: [{id:1,a:123,b:1234},{id:2,a:123,b:1234}]
//a與b的差集d: [{id:3,a:123,b:1234},{id:4,a:123,b:1234}]
//a與b的補集e: [{id:3,a:123,b:1234},{id:4,a:123,b:1234},{id:5,a:123,b:1234}]
//a與b的並集f: [{id:1,a:123,b:1234},{id:2,a:123,b:1234},{id:3,a:123,b:1234},{id:4,a:123,b:1234},{id:5,a:123,b:1234}]