2016-08-05 7 views
0

У меня есть массив объектов, которые выглядят, как показано нижеJavascript - агрегирование данных/Суммируя значения

[Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object] 

Есть несколько сотен объектов в массиве. Расширение некоторые из них ниже -

0 
: 
Object 
EVENT_TYPE_1:3 
EVENT_TYPE_2:0 
EVENT_TYPE_3:2 
EVENT_TYPE_4:6 
EVENT_TYPE_5: 
EVENT_TYPE_6:0 
EVENT_TYPE_7:0 
EVENT_TYPE_8:26 
EVENT_DATE:"2016-05-05" 

1 
: 
Object 
EVENT_TYPE_1:3 
EVENT_TYPE_2:0 
EVENT_TYPE_3:2 
EVENT_TYPE_4:6 
EVENT_TYPE_5:15 
EVENT_TYPE_6:43 
EVENT_TYPE_7:0 
EVENT_TYPE_8:26 
EVENT_DATE:"2016-05-06" 

2 
: 
Object 
EVENT_TYPE_1:30 
EVENT_TYPE_2:0 
EVENT_TYPE_3:20 
EVENT_TYPE_4:6 
EVENT_TYPE_5:1 
EVENT_TYPE_6:0 
EVENT_TYPE_7:10 
EVENT_TYPE_8:26 
EVENT_DATE:"2016-05-07" 

3 
: 
Object 
EVENT_TYPE_1:3 
EVENT_TYPE_2:0 
EVENT_TYPE_3:27 
EVENT_TYPE_4:6 
EVENT_TYPE_5:154 
EVENT_TYPE_6:0 
EVENT_TYPE_7:87 
EVENT_TYPE_8:45 
EVENT_DATE:"2016-05-08" 

Я хотел бы, чтобы сложить значения для каждого EVENT_TYPE для дней недели & генерировать выходной сигнал, как показано ниже -

[ 
{EVENT_DATE:SUN,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for SUN} 
{EVENT_DATE:MON,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for MON} 
{EVENT_DATE:TUE,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for TUE} 
{EVENT_DATE:WED,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for WED} 
{EVENT_DATE:THU,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for THU} 
{EVENT_DATE:FRI,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for FRI} 
{EVENT_DATE:SAT,EVENT_TYPE_1:<sum of all EVENT_TYPE_1 for SAT} 

{EVENT_DATE:SUN,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for SUN} 
{EVENT_DATE:MON,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for MON} 
{EVENT_DATE:TUE,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for TUE} 
{EVENT_DATE:WED,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for WED} 
{EVENT_DATE:THU,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for THU} 
{EVENT_DATE:FRI,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for FRI} 
{EVENT_DATE:SAT,EVENT_TYPE_2:<sum of all EVENT_TYPE_2 for SAT} 

{EVENT_DATE:SUN,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for SUN} 
{EVENT_DATE:MON,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for MON} 
{EVENT_DATE:TUE,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for TUE} 
{EVENT_DATE:WED,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for WED} 
{EVENT_DATE:THU,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for THU} 
{EVENT_DATE:FRI,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for FRI} 
{EVENT_DATE:SAT,EVENT_TYPE_3:<sum of all EVENT_TYPE_3 for SAT} 

{EVENT_DATE:SUN,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for SUN} 
{EVENT_DATE:MON,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for MON} 
{EVENT_DATE:TUE,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for TUE} 
{EVENT_DATE:WED,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for WED} 
{EVENT_DATE:THU,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for THU} 
{EVENT_DATE:FRI,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for FRI} 
{EVENT_DATE:SAT,EVENT_TYPE_4:<sum of all EVENT_TYPE_4 for SAT} 

{EVENT_DATE:SUN,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for SUN} 
{EVENT_DATE:MON,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for MON} 
{EVENT_DATE:TUE,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for TUE} 
{EVENT_DATE:WED,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for WED} 
{EVENT_DATE:THU,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for THU} 
{EVENT_DATE:FRI,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for FRI} 
{EVENT_DATE:SAT,EVENT_TYPE_5:<sum of all EVENT_TYPE_5 for SAT} 

{EVENT_DATE:SUN,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for SUN} 
{EVENT_DATE:MON,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for MON} 
{EVENT_DATE:TUE,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for TUE} 
{EVENT_DATE:WED,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for WED} 
{EVENT_DATE:THU,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for THU} 
{EVENT_DATE:FRI,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for FRI} 
{EVENT_DATE:SAT,EVENT_TYPE_6:<sum of all EVENT_TYPE_6 for SAT}  

{EVENT_DATE:SUN,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for SUN} 
{EVENT_DATE:MON,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for MON} 
{EVENT_DATE:TUE,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for TUE} 
{EVENT_DATE:WED,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for WED} 
{EVENT_DATE:THU,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for THU} 
{EVENT_DATE:FRI,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for FRI} 
{EVENT_DATE:SAT,EVENT_TYPE_7:<sum of all EVENT_TYPE_7 for SAT} 

{EVENT_DATE:SUN,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for SUN} 
{EVENT_DATE:MON,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for MON} 
{EVENT_DATE:TUE,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for TUE} 
{EVENT_DATE:WED,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for WED} 
{EVENT_DATE:THU,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for THU} 
{EVENT_DATE:FRI,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for FRI} 
{EVENT_DATE:SAT,EVENT_TYPE_8:<sum of all EVENT_TYPE_8 for SAT}   
] 

Вот что я 'Пробовал до сих пор -

function aggregateData(jsonData, dateField) { 
    console.log(jsonData); 

    // Days of week 
    var dayOfWeek = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]; 

    // Result array 
    var resultArray = []; 

    // Counters 
    var i, j, k, z; 

    // Scan through the days of the week 
    for (i = 0; i < dayOfWeek.length; i++) { 

     // Loop through the dataprovider 
     for (k = 0; k < jsonData.length; k++) { 

      var curr_keyset = _.keys(jsonData[k]); 
      var curr_valset = _.values(jsonData[k]); 

      // Loop through current item of the data set 
      for (z = 0; z < curr_keyset.length; z++) { 

       // Day of week of current date 
       var dow = dateFormat(new Date(curr_valset[curr_keyset.indexOf(dateField)]), "ddd").toUpperCase(); 
       resultArray[dow][curr_keyset[z]] += vals[k]; 
      } 
     } 
    } 
} 

aggregateData(jsonData, 'EVENT_DATE'); //passing JSON data & the field name that is the DATE field 

Это, очевидно, имеет некоторые ошибки. Могу ли я запросить помощь, чтобы исправить это. Я тоже пытаюсь задать вопрос. Если мне удастся заставить его работать, отчитается.

ТОК КОД

var accumulation = {}; 
var resultArr = []; 
jsonData.forEach(function (daily) { 
    //  var dow = dows[dateFormat(new Date(daily[dateField]), "ddd").toUpperCase()]; 
    var dow = dateFormat(new Date(daily[dateField]), "ddd").toUpperCase(); 
    for (var p in daily) { 
     if (p.indexOf(dateField) === -1) { 
      accumulation[p] = accumulation[p] | {}; // init if necessary 
      accumulation[p][dow] = daily[p][dow] | 0; // init if necessary 
      var valueToAdd = daily[p]; 
      accumulation[p][dow] += valueToAdd; 
     } 
    } 
    resultArr[i] = accumulation; 
}); 
console.log(accumulation); 
+0

небольшой умственный разрыв .... строки «init» должны быть || (не один батон) –

ответ

1

Примечание - я не знаю, как «jsonData», в частности, относится к «массив объектов» - я буду считать jsonData не строка, а на самом деле это массив объектов в данный момент, и я пропущу подчеркивающий материал, так как он не приносит много к таблице здесь (возможно, groupBy() и reduce() могут быть обработаны в ...)

Вы, вероятно, захотите изменить порядок вещи немного. Во-первых, установка объекта вы можете накапливать вещи в:

// example data 
    var jsonData = [ 
    {EVENT_DATE:"SUN", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26}, 
    {EVENT_DATE:"MON", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26}, 
    {EVENT_DATE:"TUES", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26}, 
    {EVENT_DATE:"WED", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26}, 
    {EVENT_DATE:"SUN", EVENT_TYPE_1:3, EVENT_TYPE_2:0, EVENT_TYPE_3:2, EVENT_TYPE_4:6, EVENT_TYPE_5:0, EVENT_TYPE_6:0, EVENT_TYPE_7:0, EVENT_TYPE_8:26} 
    ]; 

    // accumulate counts 
    var accumulation = {}; 
    jsonData.forEach(function(daily) { 
     var dow = daily.EVENT_DATE; 
     for (var p in daily) { 
      if (p.startsWith('EVENT_TYPE')) { 
       accumulation[p] = accumulation[p] || {}; // init if necessary 
       accumulation[p][dow] = accumulation[p][dow] || 0; // init if necessary 
       accumulation[p][dow] += daily[p] 
      } 
     } 
    }) 
    console.log(accumulation); 

    // flatten to results 
    var flat = []; 
    for (var et in accumulation) { 
     for (var dow in accumulation[et]) { 
      var fi = {EVENT_DATE : dow}; 
      fi[et] = accumulation[et][dow]; 
      flat.push(fi) 
     } 
    } 
    console.log(flat) 

так что теперь у вас есть хэш eventTypes -> daysOfWeek -> счет ... уплощение хэш, чтобы получить желаемый формат должен быть тривиальным здесь.

+0

Hello Jamey - Большое спасибо за это. Я опубликовал обновленный код в разделе 'CURRENT CODE' в вопросе. По какой-то причине массив накоплений, кажется, содержит только один объект в конце цикла foreach, и все значения равны нулю. – usert4jju7

+0

исправлена ​​ошибка и расширен до полного рабочего примера –

+0

Спасибо Jamey. Высоко цените вашу помощь. – usert4jju7

Смежные вопросы