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

按相同键值合并对象数组

  •  -2
  • xd1936  · 技术社区  · 6 年前

    我有一个这样的对象数组:

    [
      {
        "name": "Blah",
        "description": "This is a description"
      },
      {
        "name": "Foo",
        "description": "This is a description"
      },
      {
        "name": "Bar",
        "description": "This is a description"
      },
      {
        "name": "Blah",
        "description": "This is a description"
      },
      {
        "name": "Test",
        "description": "This is a description"
      }
    ]
    

    我想运行一些函数来组合一个 description1 + "\n" + description2 所以最终结果是:

    [
      {
        "name": "Foo",
        "description": "This is a description"
      },
      {
        "name": "Bar",
        "description": "This is a description"
      },
      {
        "name": "Blah",
        "description": "This is a description\nThis is a description"
      },
      {
        "name": "Test",
        "description": "This is a description"
      }
    ]
    

    数组的顺序不需要保留。任何帮助都将不胜感激。谢谢!

    3 回复  |  直到 6 年前
        1
  •  1
  •   amrender singh    6 年前

    你可以简单地使用 Array.reduce() 创建地图的步骤,按名称和 Object.values() 在地图上会给出您想要的结果:

    let arr = [ { "name": "Blah", "description": "This is a description" }, { "name": "Foo", "description": "This is a description" }, { "name": "Bar", "description": "This is a description" }, { "name": "Blah", "description": "This is a description" }, { "name": "Test", "description": "This is a description" } ];
    let result = Object.values(arr.reduce((a, {name,description})=>{
      if(a[name])
        a[name].description += "\n" + description;
       else
        a[name] = Object.assign({},{name,description});
       return a;
    },{}));
    console.log(result);
        2
  •  1
  •   Jonas Wilms    6 年前

    可以使用查找对象查找重复项:

     const result = [], hash = {};
     for(const {name, description} of input) {
        if(hash[name]) {
          hash[name].description += "\n" + description;
        } else {
          result.push(hash[name] = { name, description });
       }
     }
    
        3
  •  1
  •   brk    6 年前

    您可以使用reduce和findIndex来检查新数组是否有名称匹配的对象。如果是这样,则更新描述

    let orgArray = [{
        "name": "Blah",
        "description": "This is a description"
      },
      {
        "name": "Foo",
        "description": "This is a description"
      },
      {
        "name": "Bar",
        "description": "This is a description"
      },
      {
        "name": "Blah",
        "description": "This is a description"
      },
      {
        "name": "Test",
        "description": "This is a description"
      }
    ]
    
    let newArray = orgArray.reduce(function(acc, curr) {
      let findIndexs = acc.findIndex(function(item) {
        return item.name === curr.name;
    
      })
      if (findIndexs === -1) {
        let obj = {
          name: curr.name,
          description: curr.description
        }
        acc.push(obj)
      } else {
        acc[findIndexs].description = acc[findIndexs].description + ' \n ' + curr.description
      }
      return acc;
    }, []);
    console.log(newArray)