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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Можете ли вы попробовать просто отформатировать его в метку времени:
.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;
Теперь у меня есть этот .filter (function (a) {return a.MEMBERS [0] .lastseen> 1800000}) .sort (function (o) {return moment (o.newest_message) .unix ()}) .reverse () но это сортировка старой даты в первую очередь, я думаю, что reverse () отличается от обратного ?? для сортировки старых на последних местах и последних на первом
Что вам нужно, так это упорядочить с помощью простого объекта 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>
Я думаю, что это решит мою первую ситуацию, но у меня есть другое событие щелчка для сортировки по недавнему времени. Я использую этот .sort (function (o) {return moment (o.newest_message) .unix ()}), но не работает, я пробую это также contactList.sort (функция (o) {момент возврата (o.NEWEST_MESSAGE) .format ('ГГГГММДД')}). reverse (); и сортировать, но неправильно