根据存在于另一个具有不同属性的数组中的存在来过滤数组

时间:2019-04-03 21:17:49

标签: javascript arrays ecmascript-6

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"}]

我已经尝试过搜索,因此,如果您能向我指出正确的方向,那么这将对您有帮助

谢谢

4 个答案:

答案 0 :(得分:6)

建立一组ID,然后根据该ID进行过滤:

 const ids = new Set(arr2.map(it => it.id));
 const result = array1.filter(it => ids.has(it.itemId));

答案 1 :(得分:4)

您可以使用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创建一组ID并使用Set.prototype.has()而不是Array.prototype.some(),它将在线性时间中运行,而不是二次时间

See the response from @Jonas Wilms

答案 2 :(得分:0)

您可以使用以下内容:

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()循环和过滤第二个数组中具有匹配项的元素。

答案 3 :(得分:0)

尝试

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);