Lodash从一个系列中创建一个集合

时间:2016-05-17 18:04:04

标签: javascript lodash

我有以下数据结构;

=if(sumproduct((B2:B=B2)*(C2:C="sign out")*(A2:A))=0,"",if(C2="Sign in",arrayformula(sumproduct((B2:B=B2)*(C2:C="sign out")*(A2:A))-sumproduct((B2:B=B2)*(C2:C="sign in")*(A2:A))),"")) 

使用lodash库,我想创建以下数据结构;

var data = [{
    "username": "admin",
    "update": "19/07/2015 17:44:14"
}, {
    "username": "admin",
    "update": "19/07/2015 17:00"
}, {
    "username": "joebloggs",
    "update": "19/07/2015 17:00"
}, {
    "username": "joebloggs",
    "update": "19/07/2015 17:44:14"
}];

如您所见,我需要删除重复的名称并仅存储最近的日期。任何有关这方面的帮助将不胜感激,

1 个答案:

答案 0 :(得分:4)

您可以使用orderBy()update日期值降序排序,然后使用uniqBy()删除重复值。

var data = [{
    "username": "admin",
    "update": "19/07/2015 17:44:14"
}, {
    "username": "admin",
    "update": "19/07/2015 17:00"
}, {
    "username": "joebloggs",
    "update": "19/07/2015 17:00"
}, {
    "username": "joebloggs",
    "update": "19/07/2015 17:44:14"
}];

var result = _(data)
  .orderBy(v => new Date(v.update), 'desc')
  .uniqBy('username')
  .value();

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdn.jsdelivr.net/lodash/4.12.0/lodash.min.js"></script>

<强>更新

我注意到update日期值不符合IETF-compliant RFC 2822 timestampsversion of ISO8601日期格式,请将Date documentation作为参考。因此,上述解决方案不适用于最近日期条件。

您有两种方法可以解决此问题:

  1. 更改格式化update日期值的方式(来自后端或从中获取的资源)。这样,上述解决方案仍然适用。

  2. 在运行时转换日期格式。解决方案如下所示:

  3. var data = [{
        "username": "admin",
        "update": "19/07/2015 17:44:14"
    }, {
        "username": "admin",
        "update": "19/07/2015 17:00"
    }, {
        "username": "joebloggs",
        "update": "19/07/2015 17:00"
    }, {
        "username": "joebloggs",
        "update": "19/07/2015 17:44:14"
    }];
    
    var result = _(data)
      .orderBy(v => {
        var ds = v.update.split(' ');
        ds[0] = ds[0].split('/').reverse().join('/');
        return new Date(ds.join(' '));
      }, 'desc')
      .uniqBy('username')
      .value();
    
    document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
    <script src="https://cdn.jsdelivr.net/lodash/4.12.0/lodash.min.js"></script>