如何总结数组对象?

时间:2013-09-19 17:25:03

标签: javascript arrays

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

3 个答案:

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

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

答案 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

JSFiddle Demo