2017-08-01 53 views
1

計數我有,我想按日期排序對象的數組,然後通過顏色和使用金額的發生lodash排序記錄的日期,然後顏色和聚集與lodash

InitialArray = [{"date":"2017-07-26","partner":"partner1","total":102,"occurrence":10},{"date":"2017-07-27","partner":"partner1","total":100,"occurrence":20},{"date":"2017-07-27","partner":"partner1","total":110,"occurrence":25},{"date":"2017-07-27","partner":"partner2","total":105,"occurrence":30}]

我需要它將按日期排序,然後由合作伙伴進行排序,並累計給定日期的總數和發生次數。 所以我最終陣列需要的樣子:

FinalArray = [{"date":"2017-07-26","partner":"partner1","total":102,"occurrence":10},{"date":"2017-07-27","partner":"partner1","total":210,"occurrence":45},{"date":"2017-07-27","partner":"partner2","total":105,"occurrence":30}]

我是能夠達到的結果在非功能性的方式,但我想,以優化代碼,做它用lodash作爲該項目的功能性的方式已經在使用它了。我能夠找到一個例子,我可以在給定列上groupby,然後使用sum運算符來聚合其他字段。但找不到任何示例來分組2個字段,然後聚合。任何幫助表示讚賞。

回答

0

我認爲這會產生你想要的結果。

var a = [ {"date":"2017-07-26","partner":"partner1","total":102,"occurrence":10}, 
 
       {"date":"2017-07-27","partner":"partner1","total":100,"occurrence":20}, 
 
       {"date":"2017-07-27","partner":"partner1","total":110,"occurrence":25}, 
 
       {"date":"2017-07-27","partner":"partner2","total":105,"occurrence":30} 
 
      ]; 
 

 
var out = a.reduce((s,e,i) => { 
 
    if (i === 0) 
 
     s.push(e); 
 
    else 
 
     if (typeof s.find(ss => ss.date == e.date && ss.partner == e.partner && (ss.total += e.total)) == 'undefined') 
 
      s.push(e); 
 
    return s; 
 
}, []); 
 
    console.log(out);

1

,你可以第一組的項目,然後映射聚合值。

var initialArray = [{ date: "2017-07-26", partner: "partner1", total: 102, occurrence: 10 }, { date: "2017-07-27", partner: "partner1", total: 100, occurrence: 20 }, { date: "2017-07-27", partner: "partner1", total: 110, occurrence: 25 }, { date: "2017-07-27", partner: "partner2", total: 105, occurrence: 30 }], 
 
    groups = ['date', 'partner'], 
 
    result = _(initialArray) 
 
     .groupBy(o => groups.map(k => o[k]).join('|')) 
 
     .map((a, k) => ({ 
 
      date: a[0].date, 
 
      partner: a[0].partner, 
 
      total: _.sumBy(a, 'total'), 
 
      occurrence: _.sumBy(a, 'occurrence') 
 
     })) 
 
     .value(); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

相關問題