我正在尝试使用函数式编程
我有两个数组
arr1=[{prodId:2}{prodId:4}]
arr2=[{id:1, name:"Test1"},
{id:2, name:"Test2"},
{id:3, name:"Test3"},
{id:4, name:"Test4"},
{id:5, name:"Test5"}]
使用
的组合过滤,映射一些简化函数
我想从arr2中提取项目
where arr2.id === arr1.prodId
我的输出arr为:
[{id:2, name:"Test2"},
{id:4, name:"Test4"}]
我试图避免forEach并使用函数式编程。
答案 0 :(得分:5)
您应该结合使用filter
方法和includes
和map
。
let arr1=[{prodId:2},{prodId:4}], arr2=[{id:1, name:"Test1"}, {id:2, name:"Test2"}, {id:3, name:"Test3"}, {id:4, name:"Test4"}, {id:5, name:"Test5"}];
let ids = arr1.map(({prodId}) => prodId);
let result = arr2.filter(({id}) => ids.includes(id));
console.log(result);
另一种方法是使用some
方法。
let arr1=[{prodId:2},{prodId:4}], arr2=[{id:1, name:"Test1"}, {id:2, name:"Test2"}, {id:3, name:"Test3"}, {id:4, name:"Test4"}, {id:5, name:"Test5"}];
let result = arr2.filter(({id}) => arr1.some(({prodId}) => prodId == id));
console.log(result);
答案 1 :(得分:1)
这就是您要寻找的东西。
arr1=[{prodId:2},{prodId:4}]
arr2=[{id:1, name:"Test1"},
{id:2, name:"Test2"},
{id:3, name:"Test3"},
{id:4, name:"Test4"},
{id:5, name:"Test5"}]
let k=arr2.reduce((o,a)=>{
if(arr1.map(a=>a.prodId).indexOf(a.id)!=-1)
{
o.push(a)
}
return o;
},[])
console.log(k)
答案 2 :(得分:1)
使用.includes
,.find
或.some
的解决方案是数组运算,并且花费线性时间。在.filter
(另一种线性时间操作)中使用时,结果是二次时间计算。如果输入列表很大,那么影响不大。
相反,首先收集ID以匹配集合,然后利用filter
中的恒定时间查找-
const arr1 =
[ { prodId: 2 }
, { prodId: 4 }
]
const arr2 =
[ { id:1, name:"Test1" }
, { id:2, name:"Test2" }
, { id:3, name:"Test3" }
, { id:4, name:"Test4" }
, { id:5, name:"Test5" }
]
const find = (whitelist, list) =>
{ const ids =
new Set (whitelist.map(x => x.prodId)) // create a set
return list.filter(x => ids.has(x.id)) // Set#has uses constant time
}
console.log(find(arr1,arr2))
// [ { id: 2, name: "Test2" }, { id: 4, name: "Test4" } ]