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

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 работает хорошо, но не сортировка по недавней дате. Что я делаю не так, кто-то может мне помочь? заранее большое спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
6 544
3

Ответы 3

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

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

Я думаю, что это решит мою первую ситуацию, но у меня есть другое событие щелчка для сортировки по недавнему времени. Я использую этот .sort (function (o) {return moment (o.newest_message) .unix ()}), но не работает, я пробую это также contactList.sort (функция (o) {момент возврата (o.NEWEST_MESSAGE) .format ('ГГГГММДД')}). reverse (); и сортировать, но неправильно

Alfredo Izquierdo 08.11.2018 15:12

Теперь у меня есть этот .filter (function (a) {return a.MEMBERS [0] .lastseen> 1800000}) .sort (function (o) {return moment (o.newest_message) .unix ()}) .reverse () но это сортировка старой даты в первую очередь, я думаю, что reverse () отличается от обратного ?? для сортировки старых на последних местах и ​​последних на первом

Alfredo Izquierdo 08.11.2018 15:25

Что вам нужно, так это упорядочить с помощью простого объекта 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.info(st);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Вы можете использовать asc для сортировки по возрастанию и desc для сортировки по убыванию (последний аргумент). а также вы можете передать любое другое поле, которое вам нужно для сортировки по имени (в случае с простым значением), или вы можете передать обратный вызов, возвращающий значение, основанное на его сортировке.

Поскольку ваши даты в формате 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.info(result);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Другие вопросы по теме