代码之家  ›  专栏  ›  技术社区  ›  Lonely

如何转移地图。有效地将值转换为数组?

  •  2
  • Lonely  · 技术社区  · 4 年前

    在下面的示例中,您会看到一些嘈杂但简单的实现。

    初始情况

    我们有一个包含重复信息的初始数组。

    const listArray = [
      { songBy: 'George Michael',  uid: 'A',  whatEver: 12},
      { songBy: 'George Michael',  uid: 'A',  whatEver: 13},
      { songBy: 'George Michael',  uid: 'A',  whatEver: 14},
      { songBy: 'Michael Jackson', uid: 'B',  whatEver: 12},
      { songBy: 'Michael Jackson', uid: 'B',  whatEver: 16},
    ]
    

    第一步

    我们创建了一个新的地图,因为我们想摆脱第三栏,并清楚地保存艺术家的名字。(我们需要使用 songBy 因为某种原因,这是关键。我们将其在值内更改为 name ).

    const listMap = new Map();
    
    listArray.forEach(row => listMap.set(row.songBy, {name: row.songBy, uid: row.uid}));
    

    第二步

    最后,我们需要一个数组及其值:

    const distinctListArray: Array<any> = [];
    
    listMap.forEach(value => distinctListArray.push(value));
    

    因此,我们得到的结果是一系列不同的对象,其形式如下:

    [
      name: string
      uid: string
    ]
    

    问题:

    在我看来,这个实现太吵了,也没有那么优雅。步骤太多,变量太多。(这里的例子是我无法分享的真实代码的简化版本)。

    有没有办法简化代码并提高效率?

    编辑: See online: TypeScript Playground

    1 回复  |  直到 4 年前
        1
  •  3
  •   Ori Drori    4 年前

    将列表转换为 [key, value] 配对使用 Array.map() ,然后从列表中创建地图。转换 Map 通过应用 Array.from() Map.values() 迭代器( TS playground ):

    const listArray = [{"songBy":"George Michael","uid":"A","whatEver":12},{"songBy":"George Michael","uid":"A","whatEver":13},{"songBy":"George Michael","uid":"A","whatEver":14},{"songBy":"Michael Jackson","uid":"B","whatEver":12},{"songBy":"Michael Jackson","uid":"B","whatEver":16}]
    
    const distinctListArray = Array.from(
      new Map(listArray.map(({ songBy, uid }) => 
        [songBy, { name: songBy, uid }]
      )).values()
    )
    
    console.log(distinctListArray)