【问题标题】:Filter array in Typescript using functional programing [filter, map, some, reduce etc]使用函数式编程在 Typescript 中过滤数组 [filter, map, some, reduce etc]
【发布时间】:2019-06-12 16:18:34
【问题描述】:

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

我有两个数组

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

【问题讨论】:

    标签: javascript arrays typescript functional-programming rxjs


    【解决方案1】:

    您应该将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);

    【讨论】:

    • 您可以提取内部map 函数以避免每次迭代都计算操作。
    • some 方法是首选 IMO,其意图比 includes 版本更清晰。
    【解决方案2】:

    这是你要找的吗?

    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)

    【讨论】:

      【解决方案3】:

      使用.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" } ]

      【讨论】:

        猜你喜欢
        • 2019-06-14
        • 2016-06-07
        • 2021-07-17
        • 2023-03-12
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多