将对象数组转换为单个对象

时间:2018-09-07 14:11:20

标签: javascript arrays array.prototype.map

我试图将一个对象数组组合成一个对象,该对象合并所有类似属性的值。

objArray = [{
  foo: ["f", "b"],
  bar: ["e"]
}, {
  foo: ["a", "c"],
  bar: ["a", "c"]
}, {
  foo: ["f", "b"],
  bar: ["z"]
}];
const newObj = {
  foo: [],
  bar: []
};
objArray.forEach((obj) => {
  newObj.foo.push(...obj.foo);
  newObj.bar.push(...obj.bar);
});
console.log(newObj);

通过上面的代码,我得到了所需的输出。是否像上面那样使用forEach循环是实现我要设置的最佳方法?理想情况下,我不需要指定要合并的属性,我希望代码自动合并相同的属性名称。

编辑:

我需要支持IE11

5 个答案:

答案 0 :(得分:2)

可以使用嵌套的Object#entries()的reduce()来迭代属性,而无需在任何地方硬编码特定的属性名称

objArray = [{
  foo: ["f", "b"],
  bar: ["e"]
}, {
  foo: ["a", "c"],
  bar: ["a", "c"]
}, {
  foo: ["f", "b"],
  bar: ["z"]
}];

const res= objArray.reduce((acc,c)=>{
   return Object.entries(c).reduce((a,[k,v])=>{
       a[k] = (a[k] || []).concat(v)
       return a
   },acc)
},{})

console.log(res)

答案 1 :(得分:0)

您可以获取对象的条目以获取任意数量的键和值。

var data = [{ foo: ["f", "b"], bar: ["e"] }, { foo: ["a", "c"], bar: ["a", "c"] }, { foo: ["f", "b"], bar: ["z"] }],
    merged = data.reduce((r, o) => 
        Object.entries(o).reduce((s, [k, v]) =>
            Object.assign(s, { [k]: (s[k] || []).concat(v) }), r), {});
        
console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

要获得预期结果,请使用Object.keys并使用forEach进行两个循环

  1. 使用forEach的第一个循环将处理每个对象
  2. 使用Object.keys的第二个循环将处理每个对象键,并使用键将其推送到新的数组
  3. 使用Object.hasOwnProperty设置具有原始数组对象属性的newObj中的键值

objArray = [
  {
    foo: ["f", "b"],
    bar: ["e"],
    zoo: ["z"]
  },
  {
    foo: ["a", "c"],
    bar: ["a", "c"]
  },
  {
    foo: ["f", "b"],
    bar: ["z"]
  }
];
const newObj = {
  foo: [],
  bar: []
};
objArray.forEach(obj => {
  Object.keys(obj).forEach(v => {
    if (newObj.hasOwnProperty(v)) {
      newObj[v].push(obj[v]);
    }
  });
});
console.log(newObj);

codepen供参考-https://codepen.io/nagasai/pen/MqOpWm?editors=1010

答案 3 :(得分:0)

像您一样使用forEach,但内部使用for in

var objArray = [{foo: ["f", "b"],bar: ["e"]},{foo: ["a", "c"],bar:["a", "c"]},{foo: ["f", "b"],bar: ["z"]}];

var newObj = {};

objArray.forEach(o => {
  for (p in o) {
    if (!(p in newObj)) {
      newObj[p] = [];
    }
    newObj[p] = [...newObj[p], ...o[p]];
  }
});

console.log(newObj);

答案 4 :(得分:0)

获取@charlietfl答案并将其编辑为IE(使用Object.keys代替Object.entries

objArray = [{
  foo: ["f", "b"],
  bar: ["e"]
}, {
  foo: ["a", "c"],
  bar: ["a", "c"]
}, {
  foo: ["f", "b"],
  bar: ["z"]
}];

const res = objArray.reduce((acc, c) => {
  return Object.keys(c).reduce((a, k) => {
    let v = c[k];
    a[k] = (a[k] || []).concat(v);
    return a;
  }, acc);
}, {});

console.log(res)