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?