Фильтрация массива объектов по отношению к другому массиву объектов?

#javascript #arrays

#javascript #массивы

Вопрос:

 customerProducts: [
  {
    name: "foo",
    id: 123
  },
  {
    name: "test",
    id: 44
  }
]

otherProducts: [
  {
    name: "other",
    id: 44
  },
  {
    name: "test",
    id: 21
  }
]
  

Я хочу выполнить итерацию customerProducts , которая представляет собой массив объектов. Я хочу отфильтровать те customerProducts , у которых есть идентификатор, который есть у другого массива объектов, otherProducts , . Так, например, я бы хотел, чтобы возвращаемый результат в этом случае был:

   {
    name: "test",
    id: 44
  }
  

поскольку otherProducts имеет id значение 44.

Я думал о том, чтобы отобразить otherProducts и просто вернуть массив идентификаторов, а затем запустить a forEach для этого, но это кажется долгим способом сделать это.

Комментарии:

1. Создайте массив всех идентификаторов otherProducts . Затем фильтруйте customerProducts с помощью функции обратного вызова, которая использует otherIds.includes(product.id)

Ответ №1:

Создайте список Set значений для фильтрации по ( id из otherProducts ) , а затем выполните фильтрацию customerProducts по этому набору

 const customerProducts = [{name: "foo",id: 123},{name: "test",id: 44}]

const otherProducts = [{name: "other",id: 44},{name: "test",id: 21}]

const otherProductIds = new Set(otherProducts.map(({ id }) => id))

const filteredCustomerProducts = customerProducts.filter(({ id }) => 
  otherProductIds.has(id))
  
console.info(filteredCustomerProducts)  

Ответ №2:

Это можно сделать с помощью методов массива filter и некоторых других.

 customerProducts.filter((x)=> otherProducts.some(y=> y.id === x.id));
  

Объяснение:
метод filter вызовет каждый элемент в otherProducts массиве и проверит id customerProduct , присутствует ли в otherProducts хотя бы для одного элемента.

Ответ №3:

объявите customerProducts otherProducts как переменную массива JS и используйте функции поиска фильтра массива JS

 let customerProducts = [
  {
    name: "foo",
    id: 123
  },
  {
    name: "test",
    id: 44
  }
]

let otherProducts = [
  {
    name: "other",
    id: 44
  },
  {
    name: "test",
    id: 21
  }
];

let filtered = customerProducts.filter( el => otherProducts.find( e => e.id == el.id) )

console.log(filtered);