Javascript 如何在lodash中按名称降序排序?
我有一个按日期降序排列的对象数组:Javascript 如何在lodash中按名称降序排序?,javascript,lodash,Javascript,Lodash,我有一个按日期降序排列的对象数组: _.sortBy (persons.entities.alerts, dateObj => new Date(dateObj.createdDateTime) ).reverse() 这是阵列: let persons={ "entities": { "applicants": [ { "lastName": "Agamemnon", "isPrimaryApplicant": true,
_.sortBy
(persons.entities.alerts,
dateObj => new Date(dateObj.createdDateTime)
).reverse()
这是阵列:
let persons={
"entities": {
"applicants": [
{
"lastName": "Agamemnon",
"isPrimaryApplicant": true,
"id": "16671520038"
},
{
"lastName": "Purdy",
"isPrimaryApplicant": false,
"id": "16671520039"
},
{
"lastName": "Brekky",
"isPrimaryApplicant": true,
"id": "16671520040"
},
{
"lastName": "Tabouli",
"isPrimaryApplicant": true,
"id": "16671520041"
}
],
"alerts": [
{
"createdDateTime": "2018-06-14T00:00:00.000Z",
"applicants": ["16671520038", "16671520039"],
"id": "05025fea-ec37-4767-a868-a646597365d0"
},
{
"createdDateTime": "2018-06-14T00:00:00.000Z",
"applicants": ["16671520040"],
"id": "19d0da63-dfd0-4c00-a13a-cc822fc83869"
},
{
"createdDateTime": "2018-06-14T00:00:00.000Z",
"applicants": ["16671520041"],
"id": "c5385595-2104-409d-a676-c1b57346f63e"
}
]
}
}
排序按日期说明返回正确的顺序。在此示例中,日期相同。仅在这种情况下,我希望按(申请人)姓氏排序,其中isPrimaryAppendent=true?链接到Loadash sortBy不提供比较器功能选项(尽管有其他方法实现) 您可以使用数组排序方法来实现这一点:
persons.entities.alerts.sort(function(a1, a2) {
if(a1.createdDateTime === a2.createdDateTime) {
let applicant1 = persons.entities.applicants.find(a => a.id === a1.applicants[0]);
let applicant2 = persons.entities.applicants.find(a => a.id === a2.applicants[0]);
if (!applicant1.isPrimaryApplicant || applicant1.lastName < applicant2.lastName) {
return -1;
}
return 1;
} else {
let d1 = new Date(a1.createdDateTime);
let d2 = new Date(a2.createdDateTime);
return d2 - d1;
}
})
persons.entities.alerts.sort(函数(a1,a2){
如果(a1.createdDateTime==a2.createdDateTime){
让application1=persons.entities.applications.find(a=>a.id==a1.applications[0]);
让application2=persons.entities.applications.find(a=>a.id==a2.applications[0]);
如果(!application1.isprimary申请人| | application1.lastName
本想使用lodash来实现这一点,但文档并未反映现实情况。_u.sortBy的第二个参数是文档中的一个数组,但如果我传递一个函数数组,它将不起作用
您可以向通知中添加名称,并在通知中添加用于排序的排序日期:
const persons={“实体”:{“申请人”:[{“lastName”:“Agamenon”,“isprimary申请人”:true,“id”:“16671520038”},{“lastName”:“Purdy”,“isprimary申请人”:false,“id”:“16671520039”},{“lastName”:“Brekky”,“isprimary申请人”:true,“id”:“Tabouli”,“isprimary申请人”:true,“id”:“16671520041”},{“createdTime”:“2018-06-14T00:00:00.000Z”,“申请人”:[“16671520038”,“16671520039”],“id”:“05025fea-ec37-4767-a868-a646597365d0”,{“createdDateTime”:“2018-06-14T00:00:00.000Z”,“申请人”:[“16671520041”,“id”:“19d0da63-dfd0-4c00-a13a-cc822fc83869”,{“createdDateTime”:“2019-06-14T00:00:00.000Z”,“申请人”:“id”:c5385595-2104-409d-a676-c1b57346f63e“}]}
const applicationsbyid=persons.entities.applications.reduce(
(result,applicator)=>result.set(applicator.id,applicator),
新建映射(),
);
const alertsWithName=persons.entities.alerts.map((警报)=>({
…警惕,
sortDate:新日期(alert.createdDateTime).getTime(),
姓名:(1)申请人
.map((id)=>applicationsbyid.get(id))
.filter((x)=>x)//删除空
.find((申请人)=>申请人.isPrimary申请人)| |{lastName:'})。lastName
}));
//根据此处不正确的lodash文件:
//https://lodash.com/docs/4.17.11#sortBy
//我们应该能够做到这一点:
//console.log(
//_uu.sortBy(alertsWithName[
//(警报)=>新日期(警报.createdDateTime),
//(alert)=>alert.name,
// ])
// )
//然而,这将不起作用,所以可以尝试数组排序方法
console.log(
alertsWithName.sort(
(a,b)=>b.sortDate-a.sortDate | | a.name.localeCompare(b.name)
)
)
您需要lodash's,它允许排序方向。
您可以将asc
或desc
附加到您使用的每个排序属性
这将为您提供所需的订单:
\uu.orderBy(persons.entities.applicators,['lastName'],['desc'])
请注意,您的createdDateTime
属性都是相同的…是的,只有当日期相同时,我才想按名称排序。如果日期只是按日期不同。警报有什么名称?看起来警报可以有多个申请者,并且申请者数组中有具有name属性的对象。老兄,我尝试了您的代码只需将Tabouli日期更改为今天。它应该显示在顶部,因为我想按日期降序排序order@bierhier最新日期先到,将代码更改为b.sortDate-a.sortDate
,应该可以解决此问题。您是否也考虑了isPrimaryAppender=true?@bierhier是否将一个操作与多个应用程序关联如果isPrimaryApplications为true,则可以保证只有一个申请者?在这种情况下,名称可以是name,而不是字符串数组,它可以是一个字符串。是的,只需在“未定义的其他部分”中使用isPrimaryApplications=trueIs Application1获取申请者?更新答案。我实际运行了此代码,如果我将日期更改为今天申请人“16671520041”即Tabouli,则它不是列表的顶部。应按日期递减。请尝试使用最新的一个。您是否也考虑了isPrimary申请人=true?