使用lodash在集合中添加计算键

时间:2018-03-12 11:25:14

标签: javascript collections lodash

拥有以下示例集合:

var data = [ 
  { 'fabrication_order' : 'A', 'start_date' : '2018-03-10 09:00:00', 'end_date' : '2018-04-12 10:30:00', 'product_family': 'car', 'price' : 70},
  { 'fabrication_order' : 'B', 'start_date' : '2018-03-14 12:00:00', 'end_date' : '2018-04-16 13:30:00', 'product_family': 'bike', 'price' : 20},
  { 'fabrication_order' : 'C', 'start_date' : '2018-03-14 13:00:00', 'end_date' : '2018-04-14 13:30:00', 'product_family': 'bike', 'price' : 20}
]

我可以使用lodash制作统计数据:

stats = _(data)
   .groupBy('product_family')
   .map((objs, key) => ({
   'product_family' : key,
   'sum_price' : _.sumBy(objs, 'price')
   }))
   .value();
  

[{“product_family”:“car”,“sum_price”:70},{“product_family”:“bike”,“sum_price”:40}]

大。但是,如果我想计算生产持续时间怎么办?唯一的方法是通过添加自定义字段来转换输入数据(在使用lodash之前):

data = data.forEach(function(element){
element['production_duration'] = moment(element.end_date).diff(moment(element.start_date), 'hours')
})

或者有更有效的方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

我宁愿使用lodash来完成整个事情。

您可以使用map方法为每个项目添加持续时间属性,但最好的方法是在上一次sumBy调用中使用另一个map。  你可能错过的是你可以使用带有该函数的lambda而不是属性名。

stats = _(data)
   .groupBy('product_family')
   .map((objs, key) => ({
   'product_family' : key,
   'sum_price' : _.sumBy(objs, 'price'),
   'sum_duration' : _.sumBy(objs, 
          (obj) => (moment(obj.end_date).diff(moment(obj.start_date), 'hours')))
   }))
   .value();