Как найти общие и различные значения в двух массивах?

Имеется два числовых массива:

const array1 = [3, 3, 2, 2, 2];
const array2 = [5, 3, 2];

Нужно вывести массив из общих элементов:

const resGen = [3, 2];

И массив всех других элементов, которые не вошли в resGen:

const resDiff = [5, 3, 2, 2];

Как это проще всего реализовать?


Ответы (2 шт):

Автор решения: Aziz Umarov

Ответ можно найти так

let array1 = [3,3,2,2,2];
let array2 = [5,3,2];
let copyArray1 = [...array1];
let copyArray2 = [...array2];

let result = [...array1, ...array2].reduce((acc, item) => {

    if (copyArray1.includes(item) && copyArray2.includes(item)) {
        delete copyArray1[copyArray1.indexOf(item)];
        delete copyArray2[copyArray2.indexOf(item)];
        acc.intersection.push(item);
     } else if (copyArray1.includes(item)) {
        delete copyArray1[copyArray1.indexOf(item)];        
        acc.difference.push(item); 
     } else if (copyArray2.includes(item)) {
        delete copyArray2[copyArray2.indexOf(item)];        
        acc.difference.push(item); 
     }
     return acc;

}, {difference: [], intersection: []});

console.log(result);

→ Ссылка
Автор решения: Vasily

Можно сделать так:

const array1 = [3, 3, 2, 2, 2]
const array2 = [5, 3, 2]

const resGen = []
const resTemp = []
const tempArr2 = [...array2]

array1.forEach(item => {
  if (tempArr2.includes(item)) {
    resGen.push(item)
    tempArr2.splice(tempArr2.indexOf(item), 1)
  } else {
    resTemp.push(item)
  }
})

const restDiff = [...tempArr2, ...resTemp]

console.log(resGen, restDiff)
// [ 3, 2 ] [ 5, 3, 2, 2 ]

→ Ссылка