【问题标题】:Adding computed keys in a collection with lodash使用 lodash 在集合中添加计算键
【发布时间】:2018-03-12 11:25:14
【问题描述】:

有以下示例集合:

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')
})

或者有没有更有效的方法来实现这一点?

【问题讨论】:

    标签: javascript collections lodash


    【解决方案1】:

    我宁愿使用lodash 来处理整个事情。

    您可以使用map 方法为每个项目添加持续时间属性,就像您几乎所做的那样,但最好是在您上次调用map 时使用另一个sumBy。 您可能错过的是,您可以将 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();
    

    【讨论】:

    • 这正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多