Как из двух массивов получить те объекты, которые есть в одном и отсутствуют в другом?

Есть два массива:

const defaultCass = [
  {id: 15006, name: 'test'},
  {id: 15007, name: 'test'},
  {id: 15012, name: 'test'},
]

const allCass = [
  {id: 15006, name: 'test'},
  {id: 15007, name: 'test'},
  {id: 15008, name: 'test'},
  {id: 15009, name: 'test'},
  {id: 15010, name: 'test'},
  {id: 15011, name: 'test'},
  {id: 15012, name: 'test'},
]

Надо получить:

const result = [
  {id: 15008, name: 'test'},
  {id: 15009, name: 'test'},
  {id: 15010, name: 'test'},
  {id: 15011, name: 'test'}
]

Массивы более чем по 1500 объектов, желательно оптимальный вариант по производительности.
  • Вопрос задан
  • 223 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Делаем просто, ровно то, что спрошено в вопросе:

const result = allCass.filter(function(n) {
  return !this.has(n.id);
}, new Set(defaultCass.map(n => n.id)));

Делаем сложно, решаем задачу в более общем виде (источником данных могут быть не обязательно массивы; условие, по которому значения признаются равными, не будем зашивать непосредственно в код - будет параметром функции):

function* diff(data1, data2, key = n => n) {
  const getKey = key instanceof Function ? key : n => n[key];
  const keys = new Set;

  for (const n of data2) {
    keys.add(getKey(n));
  }

  for (const n of data1) {
    if (!keys.has(getKey(n))) {
      yield n;
    }
  }
}

В вашем случае применять так:

const result = [...diff(allCass, defaultCass, 'id')];

А можно и так:

Array.from(diff('abcdE', 'AcD', n => n.toLowerCase())) // ['b', 'E']

Или так:

for (const n of diff(Array(8).keys(), Array(5).keys())) {
  console.log(n); // 5 6 7
}
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Составить массив id, которые нужно исключить
const excludeIds = defaultCass.map(item => item.id);


Затем отфильтровать, оставив только те, чей id отсутствует в excludeIds
const result = allCass.filter(item => !excludeIds.includes(item.id));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект