Typescript фильтрует массив другим массивом

#typescript

#typescript

Вопрос:

Мне нужно отфильтровать один массив объектов по другому массиву объектов. Как мне это сделать с помощью Typescript?

Приведенный ниже TS работает, за исключением последней строки.

Цель: получить всех поставщиков, которые обслуживают countyId = 1.

Поставщик может обслуживать более одного округа.

Есть три поставщика, № 1 в одном округе, № 2 в двух округах.

 var all_vendors = [{ id: 1, name: 'A' }, { id: 2, name : 'B'}, { id: 3, name : 'c'}];
console.log('all vendors');
console.log(all_vendors);
var all_vendor_counties = [{ id: 1, vendorId: 1, countyId: 1 }, { id: 2, vendorId: 2, countyId: 1 }, { id: 3, vendorId: 2, countyId: 2 },];
console.log('All Vendor Counties')
console.log(all_vendor_counties);
var filtered_vendor_counties = all_vendor_counties.filter(a => a.countyId === 1);//return two vendor_counties.
console.log('Filtered Vendor Counties')
console.log(filtered_vendor_counties); 
//??? var allVendorsInCounty1 = all_vendors.filter( a=> //a is in filtered_vendor_counties)  

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

1. вы имеете в виду […all_vendors ,…all_vendor_counties].filter(…) ?

2. @jonathanHeindl, извините, я не понимаю вашего вопроса.

3. @jonathan это будет относиться к ним как к объектам того же типа, а не к поставщикам фильтров для allVendorsInCounty1

4. Я думаю, что я неправильно понял ваш вопрос, в javascript это было бы лучше всего сделать с помощью switch map, но я думаю, что в typescript вы сначала фильтруете массив all_vendor_counties , затем сопоставляете каждый округ с массивами существующих поставщиков, а затем сводите их все в один массив

5. all_vendor_counties .filter(a => a.countyId === 1) .map(county=>all_vendors.filter(vendor=>vendor.id==county.id)).reduce((arr,next)=>[…arr,…next],[])

Ответ №1:

Сначала выполните итерацию all_vendor_counties , чтобы создать набор, содержащий все vendorId , по которым вы хотите отфильтровать, затем filter all_vendors массив по тому, включен ли в этот набор поставщик id :

 var all_vendors = [{ id: 1, name: 'A' }, { id: 2, name : 'B'}, { id: 3, name : 'c'}];
var all_vendor_counties = [{ id: 1, vendorId: 1, countyId: 1 }, { id: 2, vendorId: 2, countyId: 1 }, { id: 3, vendorId: 2, countyId: 2 },];

const vendorIds = new Set(all_vendor_counties
  .filter(({ countyId }) => countyId === 1)
  .map(({ vendorId }) => vendorId)
);
const vendorsInCountyIds = all_vendors.filter(({ id }) => vendorIds.has(id));

console.log(vendorsInCountyIds);  

(также можно использовать массив и использовать .includes вместо набора .has , но .includes имеет более высокую вычислительную сложность)