繁体   English   中英

Lodash过滤/ Javascript中两个对象数组的交集

[英]Lodash filtering/intersection of two object arrays in Javascript

我有两个对象数组。 在第二个数组中,您可以从第一个数组中分配一个ID。 如果第一个数组的ID在array2中未关联,如何过滤第一个数组以仅显示结果? 我已经尝试过在lodash中过滤器的嵌套过滤器和find过滤器的嵌套过滤器,但是它不起作用。

这是我尝试过的:

array1.filter(item => item.id === find(array2,{associateID:item.id})[0] .associatedID)在过滤器内部进行查找的第二次迭代。 我尝试了类似的过滤器方法而不是查找,但是那也不起作用。 如在父过滤器参数中提供的那样,在find函数中使用item.id是否存在问题? 或者没有?

救命?

const array1 = [{
  "id": "1",
  "name": "Test 1"
},
{
  "id": "2",
  "name": "Test 2",
}
{
  "id": "3",
  "name": "Test 3",
}
]

const array2 = [{
  "id": "12",
  "name": "Test 1",
  "associatedID": "1"
},
{
  "id": "22",
  "name": "Test 2",
  "associatedID": "2"
}
{
  "id": "32",
  "name": "Test 3",
}
]

效果不佳的方法是

array1.filter(elm1 => {
  return array2.find(elm2 => elm2.associatedID === elm1).length === 1
})

如果您的数组很大,则可以根据id和associatedID对两个数组进行排序,并对两个数组都运行一个for循环,以某种方式返回结果

使用lodash的_.differenceWith()array2获得所有没有associatedID ID的array项:

 const array1 =[{"id":"1","name":"Test 1"},{"id":"2","name":"Test 2"},{"id":"3","name":"Test 3"}] const array2 = [{"id":"12","name":"Test 1","associatedID":"1"},{"id":"22","name":"Test 2","associatedID":"2"},{"id":"32","name":"Test 3"}] const result = _.differenceWith(array1, array2, ({ id }, { associatedID }) => id === associatedID ); console.log(result); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script> 

只需使用Array.filterArray.some从不与array2关联的array1获取项目:

 const array1 = [{ "id": "1", "name": "Test 1" }, { "id": "2", "name": "Test 2", }, { "id": "3", "name": "Test 3", } ] const array2 = [{ "id": "12", "name": "Test 1", "associatedID": "1" }, { "id": "22", "name": "Test 2", "associatedID": "2" }, { "id": "32", "name": "Test 3", } ] const result = array1.filter(x => !array2.some(y => y.associatedID == x.id)) console.log(result) 

使用lodash也可以通过_.differenceWith来完成:

 const array1 = [{ "id": "1", "name": "Test 1" }, { "id": "2", "name": "Test 2", }, { "id": "3", "name": "Test 3", } ] const array2 = [{ "id": "12", "name": "Test 1", "associatedID": "1" }, { "id": "22", "name": "Test 2", "associatedID": "2" }, { "id": "32", "name": "Test 3", } ] const result = _.differenceWith(array1, array2, (x,y) => x.id === y.associatedID) console.log(result) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM