使用函数式编程在Typescript中过滤数组[过滤,映射,缩小,缩小等]

时间:2019-01-18 11:43:25

标签: javascript typescript ionic-framework functional-programming rxjs

我正在尝试使用函数式编程

我有两个数组

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并使用函数式编程。

3 个答案:

答案 0 :(得分:5)

您应该结合使用filter方法和includesmap

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