繁体   English   中英

javascript将对象数组的数组求和

[英]javascript sum array of arrays of objects together

我有以下格式的数组

[
[{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}]

如果阵列中只有两个阵列,但较大的阵列中可能有更多的阵列。 我怎样才能做到这一点? 目前,我无法找到一个好的方法。 谢谢

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); 

您可以在地图/对象上循环显示项目并为年份值(键)添加值。

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}]

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

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

它可以处理任意数量的属性。

 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; } 

这是一个可行的解决方案。 这将满足您的需求。 希望能帮助到你!

 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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM