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

用第二个数组的名称替换数组中的id

  •  0
  • mrKorny  · 技术社区  · 6 年前

    我在通过 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

    3 回复  |  直到 6 年前
        1
  •  1
  •   Shidersz    6 年前

    一种可能的解决方案是首先生成 Map ids 以及 names array2 使用 Array.reduce() . 那你就可以用 Array.map() 超过 array1 以获得所需的数据。注意在下一个示例中,我可以选择输出的第二个示例。

    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 是用来 Array.find() 在里面 map() 功能:

    let res = array1.map(
      ({id, info}) => ({name: id.map(i => array2.find(o => o.nameId === i).name), info})
    );
    
        2
  •  0
  •   Jack Bashford    6 年前

    非常简单-只需使用嵌套 map 具有 find :

    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
  •  0
  •   Mathew Berg Lucas    6 年前

    这将生成第二个示例:

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