使用相同的键合并javascript数组值

时间:2018-03-02 15:51:50

标签: javascript arrays

将数组重组为输出的最佳方法是什么?我需要将具有相同键的值合并到一个对象数组中。

输入数组:

 var array = [
    {
      aaa: {
        name: "foo1",
        value: "val1"
      }
    }, 
    { 
      aaa: {
        name: "foo2",
        value: "val2"
      }
    },
    {
     bbb: {
        name: "foo3",
        value: "val3"
      }
    },
    {
      bbb: {
        name: "foo4",
        value: "val4"
      }
    }
];

所需的输出:

var output = [
   { 
    aaa: 
        [{
            name: "foo1",
            value: "val1"
        },{
        name: "foo2",
        value: "val2"
    }]
   },
   {
    bbb: 
        [{
            name: "foo3",
            value: "val3"
        },{
        name: "foo4",
        value: "val4"
    }]
  }

];

实现这一目标的最佳方法是什么? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用reduce

var array = [{aaa: {name: "foo1",value: "val1"}},{aaa: {name: "foo2",value: "val2"}},{bbb: {name: "foo3",value: "val3"}},{bbb: {name: "foo4",value: "val4"}}];

var newArray = array.reduce((c, v) => {
  for (var k in v) {
    c[k] = c[k] || [];
    c[k].push(v[k]);
  }
  return c;
}, {});

console.log(newArray);

Doc:reduce()

答案 1 :(得分:2)

您可以使用reduceforEach功能。

var array = [{    aaa: {      name: "foo1",      value: "val1"    }  },  {    aaa: {      name: "foo2",      value: "val2"    }  },  {    bbb: {      name: "foo3",      value: "val3"    }  },  {    bbb: {      name: "foo4",      value: "val4"    }  }];

var result = array.reduce((a, c) => {
  Object.keys(c).forEach((k) => { 
    if (a[k]) {
      a[k].push(c[k]);
    } else {
      a[k] = [c[k]];
    }
  })
  
  return a;
}, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }