我的java脚本代码中有3个数组:
arr1 = [ { _id: '1', sum: 100 }, { _id: '2', sum: 100 } ]
arr2 = [ { _id: '1', sum: 281.16 }, { _id: '2', sum: 863.93 } ]
arr3 = [ { _id: '1', sum: 80 }, { _id: '2', sum: 220 } ]
我现在想要的是一个数组,其中包含密钥ID和适合密钥的所有值的总和。
所以这3个数组返回以下内容:
giveMeArray = [{_id: 1, sum: 461.16} , {_id: 2, sum 1183.93}]
我不知道如何解决这个问题。
好吧我的错误......我认为这很清楚:数组长度不一样。和相同的内容。 SOORRY
arr1 = [{_id:'1',总和:100},{_ id:'2',总和:100},{_ id:'3',总和:100}]
arr2 = [{_id:'1',总和:281.16},{_ id:'2',总和:863.93}]
arr3 = [{_id:'1',总和:80},{_ id:'4',总和:220}]
答案 0 :(得分:1)
使用the reduce
method代替forEach
,而不是var giveMeArray = [arr1, arr2, arr3].reduce(function(m, a) {
for (var i=0; i<a.length; i++)
m[i].sum += a[i].sum;
return m;
}, [{_id:'1', sum:0}, {_id:'2', sum:0}]);
:
var sumsById = [arr1, arr2, arr3].reduce(function(m, a) {
for (var i=0; i<a.length; i++)
m[a[i]._id] = (m[a[i]._id] || 0) + a[i].sum;
return m;
}, {});
var giveMeArray = [];
for (var id in sumsById)
giveMeArray.push({_id: id, sum: sumsById[id]});
giveMeArray.sort(function(a,b){return a._id-b._id;});
免责声明:仅当所有数组包含相同(按_id)顺序且不稀疏的对象时才有效。如果你需要这样,它会变得更复杂:
{{1}}
答案 1 :(得分:0)
嵌套的for
循环和预定义的结束对象可以完成这个技巧:
var mainArr = [arr1, arr2, arr3];
var arrObj = [{_id:1,sum:0},{_id:2, sum:0}];
for (var i = 0; i < mainArr.length; i++) {
for (var k = 0; k < mainArr[i].length; k++) {
arrObj[k].sum += mainArr[i][k].sum;
}
}
答案 2 :(得分:0)
编辑:更改此项以考虑数组的大小可以不同。
//Merge arrays into 1
var arrTotal = arr1.concat(arr2);
arrTotal = arrTotal.concat(arr3);
var arr1Max = arr1[arr1.length - 1]._id;
var arr2Max = arr2[arr2.length - 1]._id;
var arr3Max = arr3[arr3.length - 1]._id;
//Get highest ID value (4 in our case)
var max = Math.max(arr1Max, arr2Max, arr3Max);
var newArray = new Array();
for(var i=1; i<=max; i++) {
var sum = 0;
for(var j=0; j<arrTotal.length; j++) {
if(arrTotal[j]._id == i) {
sum += arrTotal[j].sum;
}
}
newArray.push({ _id: i, sum: sum });
}
//Display all ID sums (4 in our case)
for(var i=0; i<max; i++) {
alert(newArray[i]._id + ", " + newArray[i].sum);
}
//1 = 461.16 //2 = 963.93 //3 = 100 //4 = 220