我有一个格式如下的数组
[
[{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}]
如果数组中只有两个数组,但更大数组中可能有更多数组。我怎么能实现这个目标?目前,我无法找到一个好的方法。感谢
答案 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;