【问题标题】:use Lodash to sort array of object by value使用 Lodash 按值对对象数组进行排序
【发布时间】:2025-12-22 10:10:10
【问题描述】:

我正在尝试按“名称”值对数组进行排序(使用 Lodash)。我使用 Lodash 文档创建了下面的解决方案,但是 .orderBy 似乎根本没有任何影响。任何人都可以阐明对数组进行排序的正确方法吗?

字符数组

[  
   {  
      "id":25,
      "name":"Anakin Skywalker",
      "createdAt":"2017-04-12T12:48:55.000Z",
      "updatedAt":"2017-04-12T12:48:55.000Z"
   },
   {  
      "id":1,
      "name":"Luke Skywalker",
      "createdAt":"2017-04-12T11:25:03.000Z",
      "updatedAt":"2017-04-12T11:25:03.000Z"
   }
]

功能代码

 var chars = this.state.characters;

 _.orderBy(chars, 'name', 'asc'); // Use Lodash to sort array by 'name'

 this.setState({characters: chars})

【问题讨论】:

    标签: javascript arrays lodash


    【解决方案1】:

    这个方法orderBy不会改变输入数组, 您必须将结果分配给您的数组:

    var chars = this.state.characters;
    
    chars = _.orderBy(chars, ['name'],['asc']); // Use Lodash to sort array by 'name'
    
     this.setState({characters: chars})
    

    【讨论】:

    • 嗯,似乎仍然没有排序数组。不知道我应该更新问题还是提出新问题
    • 更新了答案,也许你的错误是由于传递了两个参数而不是'name', 'asc'的数组
    • "orderBy 不会更改输入数组" ... "orderBy 会更改数组。"预期的措辞可能是“不在现场”或“不在现场”。见:en.wikipedia.org/wiki/In-place_algorithm
    • 其实你是对的,我只是删除了这句话,因为它没有添加任何答案
    • 第二个参数['asc'] 不按升序排列,要实现这一点的方法是在orderBy 之后添加reverse()(至少在版本4.17.15 中)
    【解决方案2】:

    您可以使用 lodash sortBy (https://lodash.com/docs/4.17.4#sortBy)。

    你的代码可能是这样的:

    const myArray = [  
       {  
          "id":25,
          "name":"Anakin Skywalker",
          "createdAt":"2017-04-12T12:48:55.000Z",
          "updatedAt":"2017-04-12T12:48:55.000Z"
       },
       {  
          "id":1,
          "name":"Luke Skywalker",
          "createdAt":"2017-04-12T11:25:03.000Z",
          "updatedAt":"2017-04-12T11:25:03.000Z"
       }
    ]
    
    const myOrderedArray = _.sortBy(myArray, o => o.name)
    

    【讨论】:

    • 也可以使用简写:_.sortBy(myArray, 'name')
    • orderBy相比,sortBy中不能传递排序类型,它总是按升序排序。
    【解决方案3】:

    如果你需要按日期排序,你可以使用这个解决方案:

    orderBy(items, (a) => new Date(a.createdAt), ['asc']) // or 'desc'
    

    如果你使用moment库,那么:

    orderBy(items, (a) => moment(a.createdAt), 'asc')
    

    附:请注意,lodash 不会以字符串格式对日期进行排序,因此您必须将其转换为 Date 对象。

    【讨论】: