Как фильтровать и сортировать массив по категориям и дате, используя Lodash - PullRequest
0 голосов
/ 08 ноября 2018

Привет всем, я новичок в этом, я пытаюсь отсортировать и отфильтровать массив объектов, используя 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), у меня есть lodahs, и когда я пытаюсь, например, отсортировать по дате, я использую некоторые из них, как это ...

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

Это работает, но теперь я пытаюсь фильтровать также по последним событиям, я пытаюсь что-то вроде этого, используя 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 голосов
/ 08 ноября 2018

Вам нужно упорядочить с помощью простого 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 для сортировки по убыванию (последний аргумент). а также вы можете передать любое другое поле, которое вам нужно для сортировки по имени (в случае с простым значением), или вы можете передать обратный вызов, возвращающий значение, основанное на его сортировке.

0 голосов
/ 08 ноября 2018

Поскольку ваши даты в формате ISO, вам на самом деле ничего не нужно, кроме 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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
0 голосов
/ 08 ноября 2018

Вы можете попробовать отформатировать его в метку времени:

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

И если я правильно понял, вам не нужно оборачивать contactList в функцию lodash ...

filter, sort и reverse являются собственными функциями массива.


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