2015-09-23 3 views
0

Следующие данные я получаю.Sum JSON Данные с использованием Group by in jQuery

var data =[{"Type1":2,"Type2":0,"Type3":6,"Date":"2015-01-27","Source":"Web"}, 
      {"Type1":2,"Type2":2,"Type3":0,"Date":"2015-02-27","Source":"Mobile"}, 
      {"Type1":3,"Type2":0,"Type3":7,"Date":"2015-02-27","Source":"Unknown"}, 
      {"Type1":4,"Type2":5,"Type3":9,"Date":"2015-02-27","Source":"Web"}] 

Я хочу суммировать эти данные, делая группу по дате, как это,

var result= 
       [{"Type1":2,"Type2":0,"Type3":6,"Date":"2015-01-27"}, 
       {"Type1":9,"Type2":7,"Type3":16,"Date":"2015-02-27"}] 

Для этого я написал следующий код JQuery, но не работает. Пожалуйста, предложите мне изменения.

var objects = JSON.stringify(data) 
     var grphDates = new Array(); 
      var groupedObjects = new Array(); 
      $.each(objects, function (ix, obj) { 
       var existingObj; 
       if ($.inArray(obj.Date, grphDates) >= 0) { 
        existingObj = $.grep(groupedObjects, function (o, si) { return o.Date === obj.Date; }); 
        existingObj.Type1 += obj.Type1; 
        existingObj.Type2 += obj.Type2; 
        existingObj.Type3 += obj.Type3; 
        } else { 
        groupedObjects.push(obj); 
        grphDates.push(obj.Date); 
       } 
      }); 
+0

попробуйте эту скрипку http://jsfiddle.net/fodfxz4f/ –

+0

Спасибо @Paul Booblic. Но здесь он не делает сумму по дате. Он суммирует все данные. – Rao

ответ

0

данных уже массив объектов так что не нужно делать JSON.stringify(data)

Кроме того, принять во внимание, что grep возвращает массив объектов (http://api.jquery.com/jquery.grep/)

Это изменение должно сделать это

 var data =[{"Type1":2,"Type2":0,"Type3":6,"Date":"2015-01-27","Source":"Web"}, 
      {"Type1":2,"Type2":2,"Type3":0,"Date":"2015-02-27","Source":"Mobile"}, 
      {"Type1":3,"Type2":0,"Type3":7,"Date":"2015-02-27","Source":"Unknown"}, 
      {"Type1":4,"Type2":5,"Type3":9,"Date":"2015-02-27","Source":"Web"}]; 

     var grphDates = new Array(); 
     var groupedObjects = new Array(); 
     $.each(data, function (ix, obj) { 
      var existingObj; 
      if ($.inArray(obj.Date, grphDates) >= 0) { 
       // Get index of existing object width date == obj.Date 
       var index = groupedObjects.map(function(o, i) { 
           if(o.Date == obj.Date)return i; 
           }).filter(isFinite); 

       groupedObjects[index].Type1 += obj.Type1; 
       groupedObjects[index].Type2 += obj.Type2; 
       groupedObjects[index].Type3 += obj.Type3; 
      } else { 
       groupedObjects.push(obj); 
       grphDates.push(obj.Date); 
      } 
     }); 
0

Посмотрите на использование lodash's groupBy method. Это, кажется, делает почти то, что вы ищете:

_.groupBy(data, 'Date'); 

возвращается

{ '2015-01-27': [ 
    { Type1: 2, 
     Type2: 0, 
     Type3: 6, 
     Date: '2015-01-27', 
     Source: 'Web' 
     } 
    ], 
    '2015-02-27': 
    [ { Type1: 2, 
     Type2: 2, 
     Type3: 0, 
     Date: '2015-02-27', 
     Source: 'Mobile' }, 
    { Type1: 3, 
     Type2: 0, 
     Type3: 7, 
     Date: '2015-02-27', 
     Source: 'Unknown' }, 
    { Type1: 4, 
     Type2: 5, 
     Type3: 9, 
     Date: '2015-02-27', 
     Source: 'Web' 
    } 
    ] 
} 
+0

Благодарим за отзыв. Но я не хочу использовать какие-либо другие библиотеки. – Rao