const arr1 = [1,2,9,8,6,7];
const arr2 = [8,6,3,4,1,0];
// most readable
console.log(
// arr1 without arr2
arr1.filter(x => arr2.indexOf(x)==-1),
// arr1 and arr2
arr1.filter(x => arr2.indexOf(x)!=-1),
// arr2 without arr1
arr2.filter(x => arr1.indexOf(x)==-1)
);
// fastest - O(nln(n))
(() => {
const count =
// concatenate - O(n)
[...arr1, ...arr1, ...arr2]
// sort - O(nln(n))
.sort()
// count - O(n)
.reduce((acc, cur) => {
acc[cur] = (acc[cur] || 0) +1;
return acc;
}, {});
// separate - O(n)
const a1 = [];
const a12 = [];
const a2 = [];
for (let i in count) {
switch(count[i]) {
case 1: a2.push(+i); break;
case 2: a1.push(+i); break;
case 3: a12.push(+i); break;
}
}
console.log(
a1, // arr1 without arr2
a12, // arr1 and arr2
a2 // arr2 without arr1
);
})();