拥有以下示例集合:
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')
})
或者有更有效的方法来实现这一目标吗?
答案 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();