Сумма значений из массива JSON - PullRequest
0 голосов
/ 17 июня 2020

Извините, если это дублируется, но я пытаюсь суммировать значения из вывода JSON, я могу суммировать значения из одного свойства, но мне нужно суммировать значения, соответствующие месяцу для каждое свойство, любая помощь приветствуется,

let json = 
{
   "months":[
      "Jun",
      "Jul",
      "Aug",
      "Sep",
      "Oct",
      "Nov"
   ],
   "data":{
      "label":[
         {
            "Electricity":[
               {
                  "total_bill":"84.54",
                  "due_date":"2020-06-30"
               },
               {
                  "total_bill":"62.38",
                  "due_date":"2020-07-30"
               }
            ]
         },
         {
            "Gas":[
               {
                  "total_bill":"133.26",
                  "due_date":"2020-06-29"
               },
               {
                  "total_bill":"120.25",
                  "due_date":"2020-07-30"
               }
            ]
         }
      ]
   }
}

Например, я хочу добавить total_bill для электроэнергии и газа за июнь (2020-06) и просуммировать total_bill за июль (2020-07), пожалуйста игнорировать массив месяцев, он используется только для отображения информации на графике. c.

Изменить:

То, что я пробовал до сих пор:

let labels = [];

//Get labels name, eg. Electriciy, Gas, Water, etc
for(let i = 0; i < json.data.label.length; i++) {
    labels.push(Object.keys(json.data.label[i]).toString());    
  }

//Tried to sum them but only figure out how to sum for the same property
let temp = [];
for (let i = 0; i < json.data.label.length; i++) {
    let str = labels[i];    
    let values = json.data.label[i][str];

    let sum = 0;    
    for (let j = 0; j < values.length; j++) {
     sum = sum + Number(values[j].total_bill);      
    }
   temp.push(sum);
  }

//Desired output is:
//84.54 + 133.26 and 62.38+120.25
temp = [217.8,182.63];

Большое спасибо за изучение этого и за вашу помощь

L oop edit:

Хорошо, поигравшись с l oop, я смог найти тот которые суммируют значения и возвращают желаемый результат, спасибо

for (let i = 0; i < json.data.label.length; i++) {                
    let sum = 0;
    for (let j = 0; j < json.data.label.length; j++) {
      sum = sum + Number(json.data.label[j][labels[j]][i].total_bill);
    }        
    temp.push(sum);
  }

console.log(temp); // [217.8, 182.63]

Ответы [ 2 ]

2 голосов
/ 17 июня 2020
 var sumgas = 0; 
 var sumelectric = 0;
 var date = '2020-06-20';
 json['data']['label'].forEach(function(row,idx){
   try{
       row['Gas'].forEach(function(row,idx){
           if(new Date(row['due_date']).getTime() > new Date(date).getTime()) 
           {
               sumgas += parseInt(row['total_bill'])
           }
       })
      row['SumGas'] = sumgas
   }
   catch(e){

   }
   try{
       row['Electricity'].forEach(function(row,idx){
           if(new Date(row['due_date']).getTime() > new Date(date).getTime()) 
           {
               sumelectric += parseInt(row['total_bill'])
           }
       })
     row['sumelectric'] = sumelectric
   }
   catch(e){

   }
});

console.log(sumgas)
console.log(sumelectric)

вы можете использовать этот код без каких-либо изменений

1 голос
/ 18 июня 2020

В дополнение к ответу @dauren, вот альтернативный способ решения проблемы, которую вы опубликовали:

json.data.label.
    reduce((results, currentServiceObject) => {
        let services = Object.keys(currentServiceObject);
        services.forEach(billedService => {
            currentServiceObject[billedService]
                .forEach(monthlyBill => {
                        let { total_bill, due_date } = monthlyBill;
                        let monthIndex = new Date(due_date).getMonth();
                        results[monthIndex] = 
                            results[monthIndex] ? 
                                Number.parseFloat(results[monthIndex]) + Number.parseFloat(total_bill) : 
                                Number.parseFloat(total_bill);
                })
            });
        return results;
    }, {})

Вы заметите, что итерация в этом случае немного больше задействована, однако ни один из свойства или названия счетов (например, «Электричество») должны быть известны заранее, ни даты. Мы просто предполагаем (или ожидаем), что объекты, представляющие счета, такие как "Электричество", соответствуют объекту, который сформирован двумя свойствами: 'total_bill' и 'due_date', и что первое содержит строковое значение, которое представляет сумму счета, и последний содержит строку, представляющую дату.

Возвращаемое значение приведенного выше кода будет объектом, в данном конкретном случае Object { 5: 217.8, 6: 182.63 }, где 5 представляет 6-й месяц в данном году а 6 представляет 7-й месяц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...