Javascript:合并同一个数组中的2个或更多对象

时间:2018-01-03 09:02:37

标签: javascript reactjs

任何想法如何重组像这样的数据结构

var data = [
  [{
    jan: 10,
    feb: 20,
    mar: 30,
    type: "one"
  },
  {
    jan: 20,
    feb: 10,
    mar: 40,
    type: "one"
  }],
  [
    {
    jan: 10,
    feb: 20,
    mar: 30,
    type: "two"
  },
  {
    jan: 20,
    feb: 10,
    mar: 40,
    type: "two"
  }]
]

console.log(data)

这样的事情?

var data = [
  {
    jan: 30,
    feb: 30,
    mar: 70,
    type: "one"
  },
    {
    jan: 30,
    feb: 30,
    mar: 70,
    type: "two"
  }
]

console.log(data)

如示例中所示,合并了同一数组中的对象,并添加了janfebmar键。

我的智慧结束了。 在此先感谢:)

5 个答案:

答案 0 :(得分:2)

您可以在javascript数组上使用mapreduce函数来实现结果。

使用map迭代主数组中的子数组,并在这些子数组中使用reduce来总结月数据。

var data = [
  [{
    jan: 10,
    feb: 20,
    mar: 30,
    type: "one"
  },
  {
    jan: 20,
    feb: 10,
    mar: 40,
    type: "one"
  }],
  [
    {
    jan: 10,
    feb: 20,
    mar: 30,
    type: "two"
  },
  {
    jan: 20,
    feb: 10,
    mar: 40,
    type: "two"
  }]
]

var newData = data.map(function(arr){
  return arr.reduce(function(acc, ele, i){
    if(i === 0){
      acc = ele;
    }
    else{
      var keys= Object.keys(ele);
      keys.splice(keys.indexOf("type"), 1);
      keys.forEach(function(key){
         acc[key] += ele[key];
      })
    }
    return acc;
  },{});
});
console.log(newData)

答案 1 :(得分:0)

您可以为具有相同type的对象获取哈希表,并添加非type的所有属性值。

var data = [[{ jan: 10, feb: 20, mar: 30, type: "one" }, { jan: 20, feb: 10, mar: 40, type: "one" }], [{ jan: 10, feb: 20, mar: 30, type: "two" }, { jan: 20, feb: 10, mar: 40, type: "two" }]],
    hash = Object.create(null),
    grouped = [];

data.forEach(function (a) {
    a.forEach(function (o) {
        if (!hash[o.type]) {
            hash[o.type] = { type: o.type };
            grouped.push(hash[o.type]);
        }
        Object.keys(o).forEach(function (k) {
            if (k === 'type') {
                return;
            }
            hash[o.type][k] = (hash[o.type][k] || 0) + o[k];
        });
    });
});

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

答案 2 :(得分:0)

使用reduceforEach

var output = Object.values( data.reduce( function( a, c ){
  c.forEach( function( item ){
     a[ item.type ] = a[ item.type ] || { jan: 0, feb: 0, mar: 0, type: item.type };
     a[ item.type ].jan += item.jan; 
     a[ item.type ].feb += item.feb;
     a[ item.type ].mar += item.mar;
  });
  return a;
}, {}));

<强>演示

var data = [
  [{
    jan: 10,
    feb: 20,
    mar: 30,
    type: "one"
  },
  {
    jan: 20,
    feb: 10,
    mar: 40,
    type: "one"
  }],
  [
    {
    jan: 10,
    feb: 20,
    mar: 30,
    type: "two"
  },
  {
    jan: 20,
    feb: 10,
    mar: 40,
    type: "two"
  }]
];

var output = Object.values( data.reduce( function( a, c ){
  c.forEach( function( item ){
     a[ item.type ] = a[ item.type ] || { jan: 0, feb: 0, mar: 0, type: item.type };
     a[ item.type ].jan += item.jan;
     a[ item.type ].feb += item.feb;
     a[ item.type ].mar += item.mar;
  });
  return a;
}, {}));

console.log(output);

答案 3 :(得分:0)

您可以使用array#reduce根据type值对数据进行分组。使用array#forEach遍历每个数组。

var data = [ [{ jan: 10, feb: 20, mar: 30, type: "one" }, { jan: 20, feb: 10, mar: 40, type: "one" }], [ { jan: 10, feb: 20, mar: 30, type: "two" }, { jan: 20, feb: 10, mar: 40, type: "two" }] ];
var result = Object.values(data.reduce((r,a) => {
  a.forEach(o => {
    r[o.type] = r[o.type] || Object.assign({'type': o.type});
    Object.keys(o).forEach(k => {
      if(k !== 'type')
        r[o.type][k] = (r[o.type][k] || 0) + o[k];
    });
  });
  return r;
},{}));

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

答案 4 :(得分:0)

data.reduce((a,c) => {
    return a.concat(c.reduce((a2,c2) => {
        if(Object.keys(a2).length === 0) return c2;
        return Object.assign({}, a2, {jan: a2.jan + c2.jan, feb: a2.feb + c2.feb, mar: a2.mar + c2.mar})
    },{}))
},[])

嵌套减少完全不可变的解决方案。