我有一个带有对象的多维数组,需要使用javascript计算每列的总和

时间:2018-02-17 02:59:18

标签: javascript angularjs json multidimensional-array sum

我在angularjs工作。我收到了json格式的回复。而json是

"vals": [{
        "season": "SUMMER",
        "usage": [
            ["PEAK", "1.000", "2.000", "3.000", "4.000", "5.000", "6.000", "7.000", "8.000", "9.000"],
            ["NORMAL", "10.000", "11.000", "12.000", "13.000", "14.000", "25.000", "16.000", "17.000", "18.000"],
            ["OFF-PEAK", "19.000", "20.000", "21.000", "22.000", "23.000", "24.000", "25.000", "26.000", "27.000"]
        ]
    }, {
        "season": "MONSOON",
        "usage": [
            ["PEAK", "28.000", "29.000", "30.000", "31.000", "32.000", "33.000", "34.000", "35.000", "36.000"],
            ["NORMAL", "37.000", "38.000", "39.000", "40.000", "41.000", "42.000", "43.000", "44.000", "45.000"],
            ["OFF-PEAK", "46.000", "47.000", "48.000", "49.000", "50.000", "51.000", "52.000", "53.000", "54.000"]
        ]
    }, {
        "season": "WINTER",
        "usage": [
            ["PEAK", "55.000", "56.000", "57.000", "58.000", "58.000", "59.000", "60.000", "61.000", "62.000"],
            ["NORMAL", "63.000", "64.000", "65.000", "66.000", "67.000", "68.000", "69.000", "70.000", "71.000"],
            ["OFF-PEAK", "72.000", "73.000", "74.000", "75.000", "76.000", "77.000", "78.000", "79.000", "80.000"]
        ]
    }]

我必须计算每列的值并将其推入一个新的数组,即

[(1.000+10.000+19.000+28.000+37.000+46.000+55.000+63.000+72.000),(2.000+11.000+20.000+29.000+38.000+47.000+56.000+64.000+73.000),(3.000+12.000+21.000+30.000+39.000+48.000+57.000+65.000+74.000),(4.000+13.000+22.000+31.000+40.000+49.000+58.000+66.000+75.000).....]

我正在这样做并得到了渴望的结果,但我在计算总数时提到了列号但是列可以是动态的。我很惭愧地说我无法解决它。如果有任何方法可以让它动态,请帮忙。或者如果有更好的方法请分享。我工作了5列但是json有9列。我的代码是

$scope.ctrlFn= function(){
  var raw = angular.copy($scope.subStationsData);
var calcArray = raw.vals;
$scope.grossEnergy = raw.vals;
var k1Array = [];
var k2Array = [];
var k3Array = [];
var k4Array = [];
var k5Array = [];
$scope.totalArray = [];
function getSum(total, num) {
    return total + num;
}
for (var i=0; i<calcArray.length; i++) {
  for (var j=0; j<(calcArray[i].usage.length)-1; j++){
      for (var k = 1; k < calcArray[i].usage[j].length; k++) {
          console.log('j', j)
          console.log('k', k)
          console.log('calcArray[j].usage[k]: ',calcArray[i].usage[j][k]);
          if(k==1){
            k1Array.push(calcArray[i].usage[j][k]);
            console.log('k1Array: ',k1Array);
          }
          if(k==2){
            k2Array.push(calcArray[i].usage[j][k]);
            console.log('k1Array: ',k2Array);
          }
          if(k==3){
            k3Array.push(calcArray[i].usage[j][k]);
            console.log('k1Array: ',k3Array);
          }
          if(k==4){
            k4Array.push(calcArray[i].usage[j][k]);
            console.log('k1Array: ',k4Array);
          }
          if(k==5){
            k5Array.push(calcArray[i].usage[j][k]);
            console.log('k1Array: ',k5Array);
          }
      }
  }
}
var col1 = k1Array.map(Number).reduce(getSum);
var col2 = k2Array.map(Number).reduce(getSum);
var col3 = k3Array.map(Number).reduce(getSum);
var col4 = k4Array.map(Number).reduce(getSum);
var col5 = k5Array.map(Number).reduce(getSum);
$scope.totalArray.push(col1);
$scope.totalArray.push(col2);
$scope.totalArray.push(col3);
$scope.totalArray.push(col4);
$scope.totalArray.push(col5);
console.log('totalArray: ',$scope.totalArray);
$scope.$apply();

}

2 个答案:

答案 0 :(得分:1)

您可以使用array#reduce来保存列的每个总和,并使用array#forEach迭代每个数组。

&#13;
&#13;
var data = {"vals": [{ "season": "SUMMER", "usage": [ ["PEAK", "1.000", "2.000", "3.000", "4.000", "5.000", "6.000", "7.000", "8.000", "9.000"], ["NORMAL", "10.000", "11.000", "12.000", "13.000", "14.000", "25.000", "16.000", "17.000", "18.000"], ["OFF-PEAK","19.000", "20.000", "21.000", "22.000", "23.000", "24.000", "25.000", "26.000", "27.000"] ] }, { "season": "MONSOON", "usage": [ ["PEAK", "28.000", "29.000", "30.000", "31.000", "32.000", "33.000", "34.000", "35.000", "36.000"], ["NORMAL", "37.000", "38.000","39.000", "40.000", "41.000", "42.000", "43.000", "44.000", "45.000"], ["OFF-PEAK", "46.000", "47.000", "48.000", "49.000", "50.000", "51.000", "52.000", "53.000", "54.000"] ] }, { "season": "WINTER", "usage": [ ["PEAK", "55.000", "56.000", "57.000","58.000", "58.000", "59.000", "60.000", "61.000", "62.000"], ["NORMAL", "63.000", "64.000", "65.000", "66.000", "67.000", "68.000", "69.000", "70.000", "71.000"], ["OFF-PEAK", "72.000", "73.000", "74.000", "75.000", "76.000", "77.000", "78.000", "79.000","80.000"] ] }]},
  result = data.vals.reduce((r,o) => {
    o.usage.forEach((arr) => {
      arr.slice(1).forEach((v,i) => {
        r[i] = (r[i] || 0) + +v;
      });
    });
    return r;
    },[]);
console.log(result);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

var data = {"vals" : [{
        "season": "SUMMER",
        "usage": [
            ["PEAK", "1.000", "2.000", "3.000", "4.000", "5.000", "6.000", "7.000", "8.000", "9.000"],
            ["NORMAL", "10.000", "11.000", "12.000", "13.000", "14.000", "25.000", "16.000", "17.000", "18.000"],
            ["OFF-PEAK", "19.000", "20.000", "21.000", "22.000", "23.000", "24.000", "25.000", "26.000", "27.000"]
        ]
    }, {
        "season": "MONSOON",
        "usage": [
            ["PEAK", "28.000", "29.000", "30.000", "31.000", "32.000", "33.000", "34.000", "35.000", "36.000"],
            ["NORMAL", "37.000", "38.000", "39.000", "40.000", "41.000", "42.000", "43.000", "44.000", "45.000"],
            ["OFF-PEAK", "46.000", "47.000", "48.000", "49.000", "50.000", "51.000", "52.000", "53.000", "54.000"]
        ]
    }, {
        "season": "WINTER",
        "usage": [
            ["PEAK", "55.000", "56.000", "57.000", "58.000", "58.000", "59.000", "60.000", "61.000", "62.000"],
            ["NORMAL", "63.000", "64.000", "65.000", "66.000", "67.000", "68.000", "69.000", "70.000", "71.000"],
            ["OFF-PEAK", "72.000", "73.000", "74.000", "75.000", "76.000", "77.000", "78.000", "79.000", "80.000"]
        ]
    }]};
    
var result = data.vals.reduce((r,o)=>{
	o.usage.forEach((a)=>{
		a.slice(1).forEach((v,i)=>{
			r[i] = (r[i] || 0 ) + parseFloat(v);
    	});
    });
	return r;
},[]);

console.log(result);