@Dyadko_Orest

Как оставить уникальные объекты из двух массивов?

У меня есть два массива объектов и некоторые из них идентичны. Я пробовал различные методы для того чтобы оставить только уникальные но почему-то мне возвращает или массив с дубликатами объектов или пустой массив

const arr1 = [
   { userId: 15, teamId: 25 },
   { userId: 3, teamId: 616 },
   { userId: 3, teamId: 617 }
] 

const arr2 =	[ 
	{ userId: 3, teamId: 616 }, 
	{ userId: 15, teamId: 25 } 
]

const uniq = arr1.concat(arr2.filter(function (item) {
    return arr1.indexOf(item) < 0;
})); //возвращает является массив с дубликатами

const arr3 = arr1.concat(arr2);
let unique = [...new Set(test.map(item => item))];  //возвращает является массив с дубликатами
  • Вопрос задан
  • 326 просмотров
Решения вопроса 2
Alexandroppolus
@Alexandroppolus
кодир
В этом примере все объекты уникальны - сравнение-то делается по ссылке на объект.
Так что сравнивай не сами объекты, а из значения - пары (userId, teamId)
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
function isEqual(a, b) {
  const keysA = Object.keys(a);
  const keysB = Object.keys(b);
  return keysA.length === keysB.length && keysA.every(n => a[n] === b[n]);
}


const result = arr1.concat(arr2.filter(n => arr1.every(m => !isEqual(n, m))));

или

const unique = function(arr, keys = n => n) {
  const picked = new Map;
  return arr.filter((...args) => {
    const p = []
      .concat(keys(...args))
      .reduce((acc, k) => acc.set(k, acc.get(k) ?? new Map).get(k), picked);

    return !p.set(this, p.has(this)).get(this);
  });
}.bind(Symbol());


const result = unique([ ...arr1, ...arr2 ], n => [ n.teamId, n.userId ]);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Krasnodar_etc
@Krasnodar_etc
fundraiseup
const arr3 = arr1.filter(item => !arr2.some(secondItem => secondItem.userId === item.userId));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы