按date对logging进行sorting,然后用lodash对计数进行着色和聚合

我有一个对象的数组,我想按datesorting,然后通过颜色和总结出现使用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}]

我需要按datesorting,然后按合作伙伴进行sorting,并累计给定date的总数和发生次数。 所以我最后的数组需要看起来像:

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}]

我能够以非function方式获得结果,但是我想优化代码,并使用lodash的function方式,因为项目已经在使用它了。我能够find一个例子,在那里我可以groupby一个给定的然后使用sum运算符来聚合其他字段。 但找不到任何例子,以groupby 2字段,然后聚合。 任何帮助表示赞赏。

您可以先将这些项目分组,然后映射汇总的值。

 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> 

我认为这会产生你想要的结果。

  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 );