-2

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

我不知道如何解决这个问题。

好的,我的错误......我认为这很清楚:

数组的长度不同。和相同的内容。对不起

arr1 = [ { _id: '1', sum: 100 }, { _id: '2', sum: 100 }, { _id: '3', sum: 100 } ]

arr2 = [ { _id: '1', sum: 281.16 }, { _id: '2', sum: 863.93 } ]

arr3 = [ { _id: '1', sum: 80 }, { _id: '4', sum: 220 } ]

4

3 回答 3

1

而不是forEach,使用reduce方法进行求和:

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

免责声明:仅当所有数组都包含相同(按_id)顺序的对象并且不是稀疏的时才有效。如果你需要这样,它会变得有点复杂:

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;});
于 2013-09-19T17:35:51.007 回答
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;
    }
}

演示:http: //jsfiddle.net/tymeJV/4UzQT/

于 2013-09-19T17:39:35.557 回答
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

JSFiddle 演示

于 2013-09-19T17:45:19.020 回答