使用 Lodash 对包含值的对象数组进行排序

153
我想用 Lodash 按 'name' 值对数组进行排序。我使用了 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})
3个回答

286

这个方法 orderBy 不会改变输入的数组, 你需要将结果赋值给你的数组:

var chars = this.state.characters;

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

 this.setState({characters: chars})

1
嗯,似乎仍然无法对数组进行排序。不确定是否应该更新问题或创建一个新的问题。 - user4831663
1
更新了答案,也许你的错误是因为传递了两个参数而不是一个数组给 'name', 'asc' - Artémis Young
1
orderBy 不会改变输入数组。orderBy 会原地修改数组。 - Dem Pilafian
其实你是对的,我刚刚删除了这句话,因为它对答案没有任何帮助。 - Artémis Young
那个第二个参数 ['asc'] 并不是升序排序,要实现升序排序的话,需要在 orderBy 后面加上 reverse()(至少在版本 4.17.15 中)。 - Diego Ortiz
4.17.15 版本的文档仍然说明最后一个参数可用于设置排序方式:https://lodash.com/docs/4.17.15#orderBy - Artémis Young

82
你可以使用 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)

43
你也可以使用速记方式:_.sortBy(myArray, 'name')。该代码会根据 myArray 数组中每个对象的 name 属性进行排序。 - Don
12
orderBy相比,你无法在sortBy中传递排序类型,它总是按升序排序。 - a_rahmanshah

13

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

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

如果您正在使用moment库,则:

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

顺便提一下,lodash不会对字符串格式的日期进行排序,因此您必须将其转换为日期对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接