您好,我是新来的人,我尝试使用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过滤器工作正常,但按最近日期排序没有,我在做什么错,有人可以帮助我吗?提前非常感谢您
答案 0 :(得分:2)
您可以尝试将其格式化为时间戳吗?
.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;
答案 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)。并且您还可以传递您需要按名称进行排序的其他任何字段(如果使用简单值),也可以传递一个回调,该回调返回将基于该值进行排序的值。