【问题标题】:How filter and sort array by category and date using Lodash如何使用 Lodash 按类别和日期过滤和排序数组
【发布时间】:2019-04-12 01:07:36
【问题描述】:

大家好,我是新手,我尝试使用 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 过滤器运行良好,但没有按最近日期排序,我做错了什么有人可以帮助我吗?提前非常感谢你

【问题讨论】:

    标签: javascript jquery arrays momentjs lodash


    【解决方案1】:

    由于您的日期是 ISO 格式,因此您实际上不需要任何东西,只需要 orderBydesc,如下所示:

    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);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

    【讨论】:

      【解决方案2】:

      您需要的是使用简单的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 进行降序排序(最后一个参数)。您还可以传递按名称排序所需的任何其他字段(如果是简单值),或者您可以传递一个回调,返回基于它将排序的值。

      【讨论】:

        【解决方案3】:

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

        .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;
        

        【讨论】:

        • 我认为这解决了我的第一种情况,但我还有其他按最近排序的点击事件我使用这个 .sort(function (o) { return moment(o.newest_message).unix()} ) 但不工作我也试试这个 contactList.sort(function (o) { return moment(o.NEWEST_MESSAGE).format('YYYYMMDD')}).reverse();并排序但错误
        • 我现在有这个 .filter(function (a) { return a.MEMBERS[0].lastseen > 1800000 }) .sort(function (o) { return moment(o.newest_message).unix ()}) .reverse() 但首先是对旧日期进行排序,我认为 reverse() 与 reverse 不同??用于在最后一个地方排序旧的和最近的第一个
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 2019-11-28
        • 2023-04-10
        • 1970-01-01
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多