Фильтровать массив на основе присутствия в другом массиве с другими свойствами - PullRequest
1 голос
/ 04 апреля 2019
let arr1 = [{itemId:1, name:"item1"}, {itemId:2, name:"item2"},{itemId:3, name:"item3"}]

let arr2 = [{id:1, name:"item1"}, {id:2, name:"item2"}]

Как мне отфильтровать arr1 в зависимости от того, есть ли соответствующий элемент в arr2, где arr1.itemId будет равно arr2.id

Таким образом, ожидаемый результат в этом случае будет:

[{itemId:1, name:"item1"}, {itemId:2, name:"item2"}]

Я попытался найти SO, поэтому было бы полезно, если бы существовал вопрос, если бы вы могли указать мне правильное направление

Спасибо

Ответы [ 4 ]

6 голосов
/ 04 апреля 2019

Создайте набор идентификаторов, чем фильтр на основе этого:

 const ids = new Set(arr2.map(it => it.id));
 const result = array1.filter(it => ids.has(it.itemId));
4 голосов
/ 04 апреля 2019

Вы можете использовать Array.prototype.filter () и Array.prototype.some () :

const arr1 = [{itemId:1, name:"item1"}, {itemId:2, name:"item2"},{itemId:3, name:"item3"}];
const arr2 = [{id:1, name:"item1"}, {id:2, name:"item2"}];

const result = arr1.filter(({ itemId }) => arr2.some(x => x.id === itemId));

console.log(result);

Это будет работать нормально для небольших массивов, однако , если массивы становятся большими, лучше создать набор идентификаторов из arr2 и использовать Set.prototype.has() вместо Array.prototype.some(), это будет работать в линейном времени вместо квадратичного времени .

См. Ответ от @ Jonas Wilms .

0 голосов
/ 04 апреля 2019

1001 * попробовать *

arr1.filter(x=> arr2.some(y=>y.id==x.itemId));

let arr1 = [{itemId:1, name:"item1"}, {itemId:2, name:"item2"},{itemId:3, name:"item3"}]
let arr2 = [{id:1, name:"item1"}, {id:2, name:"item2"}]


let r=arr1.filter(x=> arr2.some(y=>y.id==x.itemId));

console.log(r);
0 голосов
/ 04 апреля 2019

Вы можете использовать следующее:

let arr1 = [{itemId:1, name:"item1"}, {itemId:2, name:"item2"},{itemId:3, name:"item3"}];

let arr2 = [{id:1, name:"item1"}, {id:2, name:"item2"}];

let arr3 = arr1.filter(obj => arr2.some(other => obj.itemId == other.id));

console.log(arr3);

Который использует Array.prototype.filter() для зацикливания и фильтрации элементов, имеющих совпадающие элементы во втором массиве, используя Array.prototype.some().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...