简体   繁体   English

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

[英]I have a multi dimensional array with objects and need to calculate the sum of each column using javascript

I am working in angularjs. 我正在用angularjs工作。 i am getting a response in json format. 我收到json格式的回应。 and the json is 而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"]
        ]
    }]

I have to calculate the value of each column and push that into a new array ie 我必须计算每列的值并将其推入新数组,即

[(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).....]

I was doing that and got the desire result but i mention the column number when i am calculating the total but column can be dynamic. 我这样做并获得了期望的结果,但是在计算总数时我提到了列号,但列可以是动态的。 I was ashamed to say that i was unable to solve it. 我很say愧地说我无法解决它。 If there is any way to make it dynamic please help. 如果有任何方法可以使其动态,请提供帮助。 or if there is any better way then please share. 或者,如果有更好的方法,请分享。 I worked for 5 columns but given json has 9 columns. 我工作了5列,但给出的json有9列。 My code is 我的代码是

$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();

} }

You can use array#reduce to hold each sum of the column and iterate each array using array#forEach . 您可以使用array#reduce保留列的每个和,并使用array#forEach迭代每个数组。

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM