javascript将对象数组的数组加在一起

时间:2017-04-29 13:44:20

标签: javascript

我有一个格式如下的数组

[
[{year:2015, value:23000, value1:1000},{year:2016,value:1000, value1:2000},{year:2017,value:400, value1:3000}],
[{year:2015, value:10000, value1:1000},{year:2016,value:2000, value1:3000},{year:2017,value:500, value1:2000}],
]

我想将它们加在一起,在这个例子中,我想要

[{year:2015,value:33000, value1:2000},{year:2016,value:3000, value1:5000},{year:2017,value:900, value1:5000}]

如果数组中只有两个数组,但更大数组中可能有更多数组。我怎么能实现这个目标?目前,我无法找到一个好的方法。感谢

4 个答案:

答案 0 :(得分:2)

Ecmascript5 解决方案:



var arr = [
        [{year:2015, value:23000, value1:1000},{year:2016,value:1000, value1:2000},{year:2017,value:400, value1:3000}],
        [{year:2015, value:10000, value1:1000},{year:2016,value:2000, value1:3000},{year:2017,value:500, value1:2000}]
    ],
    
    // summing up values for each `year`
    years = arr.reduce(function (r, a) {
        a.forEach(function (o) {
            y = o.year;
            if (Array.isArray(r[y])) {
                r[y][0] += o.value;
                r[y][1] += o.value1;
            } else {
                r[y] = [o.value, o.value1];
            }
        });
        return r;
    }, {}),

    // constructing the resulting array containing objects with `year` totals
    result = Object.keys(years).map(function (y) {
        return {year: y, value: years[y][0], value1: years[y][1]};
    });

console.log(result);




答案 1 :(得分:1)

您可以在地图/对象中循环遍历项目并在年份数字(键)中重新添加值。

var data = [
[{year:2015, value:23000},{year:2016,value:1000},{year:2017,value:400}],
[{year:2015, value:10000},{year:2016,value:2000},{year:2017,value:500}],
];

var output = {};

data.forEach(function(item) {
  item.forEach(function(obj) {
    output[obj.year] = (output[obj.year] || 0) + obj.value;
  });
});
output = [output]

console.log(output);

一种方法是首先平整这个2D阵列。

var output = {};
var flatArray = data.reduce(function(a, b) {
  return a.concat(b);
}, []);

flatArray.forEach(function(obj) {
  output[obj.year] = (output[obj.year] || 0) + obj.value;
});

output = [output]
console.log(output);
  输出:[{     2015年:33000,     2016:3000,     2017:900   }]

答案 2 :(得分:1)

您可以使用哈希表来收集一年,并使用迭代所有给定对象属性的数组嵌套方法。

然后创建新属性并添加实际值。

它适用于任意数量的属性。



var data = [[{ year: 2015, value: 23000, value1: 1000 }, { year: 2016, value: 1000, value1: 2000 }, { year: 2017, value: 400, value1: 3000 }], [{ year: 2015, value: 10000, value1: 1000 }, { year: 2016, value: 2000, value1: 3000 }, { year: 2017, value: 500, value1: 2000 }]],
    result = data.reduce(function (hash) {
        return function (r, a) {
            a.forEach(function (o) {
                if (!hash[o.year]) {
                    hash[o.year] = { year: o.year };
                    r.push(hash[o.year]);
                }
                Object.keys(o).forEach(function (k) {
                    if (k !== 'year') {
                        hash[o.year][k] = (hash[o.year][k] || 0) + o[k];
                    }
                });
            });
            return r;
        };
    }(Object.create(null)), []);

console.log(result);

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




答案 3 :(得分:0)

这是一个有效的解决方案。这将做你正在寻找的。希望它有所帮助!



var arr =   [
      [{year:2015, value:23000, value1:1000},{year:2016,value:1000, value1:2000},{year:2017,value:400, value1:3000}],
          [{year:2015, value:10000, value1:1000},{year:2016,value:2000, value1:3000},{year:2017,value:500, value1:2000}],
      ]

var result = [];

  for(var i = 0; i < arr[0].length; i++){
      var count = 0
      var count2 = 0;
      for(var j = 0; j < arr.length; j++){
       var year = arr[j][i].year;
       count  += arr[j][i].value;
       count2 += arr[j][i].value1;
      }
      result.push({
          year: year,
          value: count,
          value1: count2
      });
  }
  console.log(result);
&#13;
&#13;
&#13;