【问题标题】:lodash sort an array of objects by a property which has an array of objectslodash 按具有对象数组的属性对对象数组进行排序
【发布时间】:2019-07-02 21:12:01
【问题描述】:

我有一个对象。我可以使用 lodash 的 _.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-6 lodash


    【解决方案1】:

    您可以使用_.get() 提取subjects 中第一项的name(或id)。如果不存在项目,_.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>

    【讨论】:

    • 感谢代码 sn-p。效果很好。但我总是在 orderBy 中使用 .tolowercase() 以确保它不区分大小写。因此,当我将 .tolowercase 应用于代码上方时,我收到错误消息,因为其中一项没有任何主题。 const 结果 = _.orderBy(arr, o => _.get(o, 'subject[0].name').toLowercase())
    • 查看更新。虽然我们可以使用_.get() 默认值并设置一个空字符串,但这会改变排序顺序。解决方法是检查name是否为字符串,是否设置为小写,如果不返回原样。
    【解决方案2】:

    _.sortBy 与比较/排序函数参数一起使用。您的函数本身可以查看接收参数subject 键(我认为它是您要比较的主题?)

    【讨论】:

      【解决方案3】:

      由于您的问题也用ES6 标记,因此这是通过Array.sort 提供的仅限JS 的解决方案:

      let 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 = arr.sort((a,b) => 
        a.subject.length && b.subject.length 
         ? a.subject[0].name.localeCompare(b.subject[0].name) 
         : a.subject.length ? -1 : 1)
      
      console.log(result)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 2016-11-25
        • 2012-02-20
        • 2010-11-02
        相关资源
        最近更新 更多