【问题标题】:Replacing the id in the array with the name from the second array用第二个数组中的名称替换数组中的 id
【发布时间】:2019-10-12 00:25:25
【问题描述】:

我在通过id 将两个数组与对象连接并将id 替换为第二个数组中的NAME 时遇到一些问题。例如我有数组:

array1 = [
  {id: [1, 2], info: "xxx"},
  {id: [2, 3], info: "yyy"}
]

array2 = [
  {nameId: 1, name: "Miami"},
  {nameId: 2, name: "Wacanda"},
  {nameId: 3, name: "London"},
]

我想修改array1 或创建新的array3 喜欢(使用ES6):

array1 = [
  {id: ["Miami", "Wacanda"], info: "xxx"},
  {id: ["Wacanda", "London"], info: "yyy"}
]

array3 = [
  {name: ["Miami", "Wacanda"], info: "xxx"},
  {name: ["Wacanda", "London"], info: "yyy"}
]

快速编辑链接: https://stackblitz.com/edit/angular-lrnfrd?file=src%2Fapp%2Ftesting%2Ftesting.component.ts

【问题讨论】:

    标签: javascript arrays angular object ecmascript-6


    【解决方案1】:

    一种可能的解决方案是首先使用Array.reduce()idsnames 之间从array2 生成Map。然后您可以在array1 上使用Array.map() 来获取所需的数据。请注意,在下一个示例中,我选择了您的第二个输出示例。

    const array1 = [
      {id: [1, 2], info: "xxx"},
      {id: [2, 3], info: "yyy"}
    ];
    
    const array2 = [
      {nameId: 1, name: "Miami"},
      {nameId: 2, name: "Wacanda"},
      {nameId: 3, name: "London"},
    ];
    
    let nameFromId = array2.reduce(
        (acc, {nameId, name}) => (acc.set(nameId, name), acc),
        new Map()
    );
    
    let res = array1.map(({id, info}) => ({name: id.map(i => nameFromId.get(i)), info}));
    
    console.log(res);
    .as-console {background-color:black !important; color:lime;}
    .as-console-wrapper {max-height:100% !important; top:0;}

    另一种不生成Map 的方法是在map() 函数中使用Array.find()

    let res = array1.map(
      ({id, info}) => ({name: id.map(i => array2.find(o => o.nameId === i).name), info})
    );
    

    【讨论】:

    • 谢谢回答。我只有一个问题,如果没有带有减少的generete Map() 的解决方案。也许只使用方法 f.e. forEach、过滤器、映射、包含?
    • 是的,还有其他没有Map 的解决方案,您可以将Map 替换为object,使用ids 作为keysnames 作为values .另一种性能较差的替代方法是在 map() 函数中使用 Array.find()let res = array1.map(({id, info}) => ({name: id.map(i => array2.find(o => o.nameId === i).name), info}));
    • 我还有一个问题。如果我有更大的对象怎么办?不仅有 2 个属性(id、info),还有 10 个或更多?
    • @mrKorny 您可以使用扩展语法,例如:let res = array1.map(({id, ...others}) => ({name: id.map(i => array2.find(o => o.nameId === i).name), ...others}));
    【解决方案2】:

    真的很简单——只需使用嵌套的mapfind

    const array1 = [{id:[1,2],info:"xxx"},{id:[2,3],info:"yyy"}];
    const array2 = [{nameId:1,name:"Miami"},{nameId:2,name:"Wacanda"},{nameId:3,name:"London"}];
    const array3 = array1.map(({ id, info }) => ({ name: id.map(e => array2.find(({ nameId }) => nameId == e).name), info }));
    console.log(array3);
    .as-console-wrapper { max-height: 100% !important; top: auto; }

    【讨论】:

      【解决方案3】:

      这将生成您的第二个示例:

      var array3 = array1.map(({ id, info }) => ({
          name: array2.filter(({ nameId }) => id.includes(nameId)).map(({ name }) => name),
          info
      }));
      

      首先它过滤来自 array1 的 id 列表中的 nameId,然后运行 ​​map 以仅返回名称。预期输出变为:

      [
          {"name":["Miami","Wacanda"],"info":"xxx"},
          {"name":["Wacanda","London"],"info":"yyy"}
      ]
      

      【讨论】:

        猜你喜欢
        • 2010-12-07
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        • 2012-07-01
        相关资源
        最近更新 更多