Ecmascript 6 lodash按具有对象数组的属性对对象数组进行排序

Ecmascript 6 lodash按具有对象数组的属性对对象数组进行排序,ecmascript-6,lodash,Ecmascript 6,Lodash,我有一个目标。我可以使用lodash的u2; orderBy对项目进行排序。 然而,在其中一个场景中,我必须按主题排序,这是一个对象数组。主题数组中的项目已根据名称进行排序 作为对象的数组,我需要考虑排序的第一个项目。 [ { "id": "1", "name": "peter", "subject": [ { "id": "1", "name": "maths" }, { "id":

我有一个目标。我可以使用lodash的u2; orderBy对项目进行排序。 然而,在其中一个场景中,我必须按主题排序,这是一个对象数组。主题数组中的项目已根据名称进行排序

作为对象的数组,我需要考虑排序的第一个项目。

[
  {
    "id": "1",
    "name": "peter",
    "subject": [
      {
        "id": "1",
        "name": "maths"
      },
      {
        "id": "2",
        "name": "social"
      }
    ]
  },
  {
    "id": "2",
    "name": "david",
    "subject": [
      {
        "id": "2",
        "name": "physics"
      },
      {
        "id": "3",
        "name": "science"
      }
    ]
  },
  {
    "id": "3",
    "name": "Justin",
    "subject": [
    ]
  }
]
您可以使用提取主题中第一项的名称或id。如果不存在项,\ uu.get将返回undefined,可以用默认值替换。在这种情况下,我们不希望使用空字符串作为默认值,因为顺序会改变。相反,我检查值是否是字符串,如果是,我使用小写,如果不是,我按原样返回

const arr=[{id:1,name:peter,subject:[{id:1,name:math},{id:2,name:social}]},{id:2,name:david,subject:[{id:2,name:physics},{id:3,name:science},{id:3,name:Justin,subject:[]] const result=\uu.orderByarr,o=>{ const name=u.geto,'subject[0].name' return.isStringname?name.toLowerCase:name } console.logresult
将u.sortBy与比较/排序函数参数一起使用。函数本身可以查看receiving arguments subject键,我认为这是您要比较的主题?

因为您的问题也用ES6标记,这里有一个JS专用的解决方案:

设arr=[{id:1,name:peter,subject:[{id:1,name:math},{id:2,name:social}]},{id:2,name:david,subject:[{id:2,name:physics},{id:3,name:science}]},{id:3,name:Justin,subject:[]} const result=arr.sorta,b=> a、 subject.length&&b.subject.length ? a、 主题[0]。名称。localeCompareb.subject[0]。名称 :主题长度-1 : 1
console.logresultThanks查看代码段。效果很好。但我总是在orderBy中使用.tolowercase,以确保它不区分大小写。因此,当我将.tolowercase应用于上面的代码时,我得到了一个错误,因为其中一个项没有任何主题。const result=\.orderByarr,o=>\.geto,'subject[0].name'。ToLowerCase更新。尽管我们可以使用u.get默认值并设置空字符串,但这将更改排序顺序。解决方案是检查名称是否为字符串,是否将其设置为小写,如果不按原样返回。