ecmascript-6 - lodash 按具有对象数组的属性对对象数组进行排序
问题描述
我有一个对象。我可以使用 lodash's 对项目进行排序_.orderBy()
。但是,在其中一种情况下,我必须按 排序subject
,这是一个对象数组。数组中的项目subject
已经根据name
.
作为subject
对象数组,我需要考虑第一项进行排序。
[
{
"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": [
]
}
]
解决方案
您可以使用_.get()
提取中第一项的name
(或) 。如果不存在项目,将返回,可以替换为默认值。在这种情况下,我们不想使用空字符串作为默认值,因为顺序会改变。相反,我正在检查该值是否为字符串,如果是,我使用小写,如果不是,则按原样返回。id
subjects
_.get()
undefined
const arr = [{"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":[]}]
const result = _.orderBy(arr, o => {
const name = _.get(o, 'subject[0].name')
return _.isString(name) ? name.toLowerCase() : name
})
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>