首页 > 解决方案 > 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": [
    ]
  }
]

标签: ecmascript-6lodash

解决方案


您可以使用_.get()提取中第一项的name(或) 。如果不存在项目,将返回,可以替换为默认值。在这种情况下,我们不想使用空字符串作为默认值,因为顺序会改变。相反,我正在检查该值是否为字符串,如果是,我使用小写,如果不是,则按原样返回。idsubjects_.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>


推荐阅读