Ecmascript 6 lodash按具有对象数组的属性对对象数组进行排序
我有一个目标。我可以使用lodash的u2; orderBy对项目进行排序。 然而,在其中一个场景中,我必须按主题排序,这是一个对象数组。主题数组中的项目已根据名称进行排序Ecmascript 6 lodash按具有对象数组的属性对对象数组进行排序,ecmascript-6,lodash,Ecmascript 6,Lodash,我有一个目标。我可以使用lodash的u2; orderBy对项目进行排序。 然而,在其中一个场景中,我必须按主题排序,这是一个对象数组。主题数组中的项目已根据名称进行排序 作为对象的数组,我需要考虑排序的第一个项目。 [ { "id": "1", "name": "peter", "subject": [ { "id": "1", "name": "maths" }, { "id":
作为对象的数组,我需要考虑排序的第一个项目。
[
{
"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默认值并设置空字符串,但这将更改排序顺序。解决方案是检查名称是否为字符串,是否将其设置为小写,如果不按原样返回。