【问题标题】:Is it possible to "filter" a Map by value in Typescript?是否可以在 Typescript 中按值“过滤”地图?
【发布时间】:2018-03-18 05:46:03
【问题描述】:

我正在寻找一种按值而不是键过滤地图的方法。我有一个在我的 Angular 应用程序中建模如下的数据集:

{
  "85d55e6b-f4bf-47bb-a988-78fdb9650ef0": {
    is_deleted: false,
    public_email: "007@example.org",
    id: "85d55e6b-f4bf-47bb-a988-78fdb9650ef0",
    modified_at: "2017-09-26T15:35:06.853492Z",
    social_url: "https://facebook.com/jamesbond007",
    event_id: "213b01de-da9e-4d19-8e9c-c0dae63e019c",
    visitor_id: "c3c232ff-1381-4776-a7f2-46c177ecde1c",
  },
}

这些条目上的键与条目值上的id 字段相同。

鉴于其中几个条目,我想过滤并返回一个 new Map(),其中仅包含具有给定 event_id 的那些条目。如果这是一个数组,我会执行以下操作:

function example(eventId: string): Event[] {
  return array.filter((item: Event) => item.event_id === eventId);
}

本质上,我正在尝试复制Array.prototype.map() 的功能 - 只是在地图而不是数组上。

如果 Lodash 有助于以更简洁的方式实现这一点,我愿意使用它,因为它已经在我的项目中可用。

【问题讨论】:

标签: angular typescript ecmascript-6 lodash


【解决方案1】:

Array.from(map.values()).filter((item: Event) => item.event_id === eventId);

或者对于 TypeScript downlevelIteration 选项,

[...map.values()].filter((item: Event) => item.event_id === eventId);

【讨论】:

    【解决方案2】:

    首先需要将地图展平,然后将内容提取到Events对象中

    let dataSet = {
         "entry1" : {  id: "85d55e6b-f4bf-47b0" },
         "entry2" : {  visitor_id: "6665b-7555bf-978b0" } 
    }
    
     let flattenedMap = {};
        Object.entries(dataSet).forEach(
               ([key,value]) => Object.assign(flattenedMap, value)
         );
      
    
    console.log("The flattened Map")
    console.log(flattenedMap)
    
    let events = [];
    Object.entries(flattenedMap).forEach(
        ([key, value]) => events.push({"event_id" : value})
    );
    
    console.log("The events");
    console.log(events);

    【讨论】:

      【解决方案3】:

      这是一个将键和值保持在一起的简短语法:

      const dict = new Map([["Z", 1324], ["A", 1], ["B", 2], ["C", 3], ["D", -12345]])
      
      const filtered = [...dict.entries()].filter( it => it[1] < 10 ) 
      
      // >  [ [ 'A', 1 ], [ 'B', 2 ], [ 'C', 3 ], [ 'D', -12345 ] ] 
      

      【讨论】:

        【解决方案4】:

        这个使用Object.entries将map转为数组,Object.fromEntries转回map。

        let qs = {a:'A 1',b:null,c:'C 3'};
        let qsfiltered = Object.fromEntries(
            Object.entries(qs).filter(([k,v]) => v !== null)
        );
        
        console.log(JSON.stringify(qsfiltered));
        

        【讨论】:

          猜你喜欢
          • 2011-02-03
          • 1970-01-01
          • 2015-09-03
          • 1970-01-01
          • 2012-07-12
          • 2020-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多