2017-08-01 25 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>

相关问题