![](/img/trans.png)
[英]Create 1d array from 2d array's sub objects using [filter, map, some, reduce etc]
[英]Filter array in Typescript using functional programing [filter, map, some, reduce etc]
我正在尝试使用函数式编程
我有两个数组
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 并使用函数式编程。
您应该将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);
使用.includes
、 .find
或.some
解决方案是数组操作和成本线性时间。 当在.filter
,另一个线性时间运算,结果是二次时间计算。 如果输入列表很大,则这种影响并非微不足道。
相反,首先收集要在 Set 中匹配的 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" } ]
这是你想要的。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.