如何使用Lodash按类别和日期对数组进行过滤和排序

时间:2018-11-08 13:56:04

标签: javascript jquery arrays momentjs lodash

您好,我是新来的人,我尝试使用lodash排序和过滤对象数组,我不知道这是正确的解决方案,但我知道这是可行的,我有一些类似这样的数组...

contactList =[    { 
      "ChatCount": 2, "chatid": 10000413, "createdon": "2018-10-25T13:49:50.9900000", "isArchive": 0, "isOnline": false ,
      "members":[{"id": "60259166", "lastseen": 15261867,"name": "la", "picture": "/la/5285871.250.jpg"}],
      "message": "",
      "message_cnt": 1,
      "messageid": 1,
      "newest_message": "2018-10-25T13:49:50.9900000",
      "oldest_message": "2018-10-25T13:49:50.9900000",
      "received_cnt": 0,
      "sentby": [{"id":59,"name":"betsynray","picture":"/betsynray/2884P1010025250.jpg","lastseen":1164}],
      "unread_cnt": 1
     },
     {
         "ChatCount": 2, "chatid": 61247987, "createdon": "2018-10-25T13:49:14.9170000", "isArchive": 0,"isOnline": true,
         "members":[{"id": 61247987, "lastseen": 15318187,"name": "li", "picture": "/li/4705502.250.jpg"}],
         "message": "good",
        "message_cnt": 2,
        "messageid": 2,
        "newest_message": "2018-10-31T10:20:29.5000000",
        "oldest_message": "2018-10-25T13:47:59.6700000",
        "received_cnt": 0,
        "sentby": [{"id":59,"name":"mm","picture":"/mm/2884P1010025250.jpg","lastseen":1164}],
        "unread_cnt": 3
     }

]

我想过滤(sentBy.lastseen> 18000)并使用(newest_message)按最近的日期排序我有罗达,例如,当我尝试按日期排序时,我使用的是这样的...

contactList.sort(function (o) { return moment(o.NEWEST_MESSAGE).format('YYYYMMDD')}).reverse();

这可以正常工作,但现在我也尝试使用lastseen过滤器,我尝试使用lodas和momentjs这样的东西

 function any() {

   var status = _(contactList)
        .filter(function (a) { return a.MEMBERS[0].lastseen > 1800000 }) 
        .sort(function (o) { return moment(o.NEWEST_MESSAGE).format('YYYYMMDD')}).reverse() // sort names
        .value();
        return status;

}

latseen过滤器工作正常,但按最近日期排序没有,我在做什么错,有人可以帮助我吗?提前非常感谢您

3 个答案:

答案 0 :(得分:2)

您可以尝试将其格式化为时间戳吗?

.sort(function (o) { return moment(o.newest_message).unix()})

如果我看对了,就不需要将contactList包装在lodash函数中...

filtersortreverse是本机数组函数。


var status = contactList
        .filter(function (a) { return a.members[0].lastseen > 1800000 })
        .sort(function (o) { return moment(o.newest_message).unix() })
        .reverse();
return status;

答案 1 :(得分:1)

由于您的日期为ISO格式,因此实际上除了array(0) {}orderBy之外,什么都不需要,

desc
var data = [{ "ChatCount": 2, "chatid": 10000413, "createdon": "2018-10-25T13:49:50.9900000", "isArchive": 0, "isOnline": false, "members": [{ "id": "60259166", "lastseen": 15261867, "name": "la", "picture": "/la/5285871.250.jpg" }], "message": "", "message_cnt": 1, "messageid": 1, "newest_message": "2018-10-25T13:49:50.9900000", "oldest_message": "2018-10-25T13:49:50.9900000", "received_cnt": 0, "sentby": [{ "id": 59, "name": "betsynray", "picture": "/betsynray/2884P1010025250.jpg", "lastseen": 1164 }], "unread_cnt": 1 }, { "ChatCount": 2, "chatid": 61247987, "createdon": "2018-10-25T13:49:14.9170000", "isArchive": 0, "isOnline": true, "members": [{ "id": 61247987, "lastseen": 15318187, "name": "li", "picture": "/li/4705502.250.jpg" }], "message": "good", "message_cnt": 2, "messageid": 2, "newest_message": "2018-10-31T10:20:29.5000000", "oldest_message": "2018-10-25T13:47:59.6700000", "received_cnt": 0, "sentby": [{ "id": 59, "name": "mm", "picture": "/mm/2884P1010025250.jpg", "lastseen": 1164 }], "unread_cnt": 3 } ];

var result = _(data)
  .filter(x => _.get(x, 'members.0.lastseen') > 1800000)
  .orderBy('newest_message', 'desc')
  .value();

console.log(result);

答案 2 :(得分:0)

您需要的是使用简单的Date对象进行排序,根本不需要moment(但是您仍然可以将其用于复杂的日期逻辑。

应该是:

_.orderBy(contactList, o=>new Date(o.newest_message), 'desc')

这是一个有效的示例:

var contactList =[    { 
      "ChatCount": 2, "chatid": 10000413, "createdon": "2018-10-25T13:49:50.9900000", "isArchive": 0, "isOnline": false ,
      "members":[{"id": "60259166", "lastseen": 15261867,"name": "la", "picture": "/la/5285871.250.jpg"}],
      "message": "",
      "message_cnt": 1,
      "messageid": 1,
      "newest_message": "2018-10-25T13:49:50.9900000",
      "oldest_message": "2018-10-25T13:49:50.9900000",
      "received_cnt": 0,
      "sentby": [{"id":59,"name":"betsynray","picture":"/betsynray/2884P1010025250.jpg","lastseen":1164}],
      "unread_cnt": 1
     },
     {
         "ChatCount": 2, "chatid": 61247987, "createdon": "2018-10-25T13:49:14.9170000", "isArchive": 0,"isOnline": true,
         "members":[{"id": 61247987, "lastseen": 15318187,"name": "li", "picture": "/li/4705502.250.jpg"}],
         "message": "good",
        "message_cnt": 2,
        "messageid": 2,
        "newest_message": "2018-10-31T10:20:29.5000000",
        "oldest_message": "2018-10-25T13:47:59.6700000",
        "received_cnt": 0,
        "sentby": [{"id":59,"name":"mm","picture":"/mm/2884P1010025250.jpg","lastseen":1164}],
        "unread_cnt": 3
     }

];

var st = _(contactList)
        .filter(a => a.members[0].lastseen > 1800000) 
        .orderBy(o=>new Date(o.newest_message), 'desc')
        .value();
        
console.log(st);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

您可以使用asc进行升序,使用desc进行降序排序(最后一个arg)。并且您还可以传递您需要按名称进行排序的其他任何字段(如果使用简单值),也可以传递一个回调,该回调返回将基于该值进行排序的值。