158

I am trying to sort an array by 'name' value (using Lodash). I used the Lodash docs to create the solution below however .orderBy doesn't seem to be having any affect at all. Can anyone shed some light on the correct way to sort array?

Chars Array

[  
   {  
      "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"
   }
]

Function Code

 var chars = this.state.characters;

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

 this.setState({characters: chars})

3 Answers 3

293

This method orderBy does not change the input array, you have to assign the result to your array :

var chars = this.state.characters;

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

 this.setState({characters: chars})
Sign up to request clarification or add additional context in comments.

2 Comments

That second parameter ['asc'] doesn't order ascending, to achieve that the way would be to add a reverse() after the orderBy (at least in version 4.17.15)
The documentation for 4.17.15 still says that the last parameter can be used to set the order : lodash.com/docs/4.17.15#orderBy
82

You can use lodash sortBy (https://lodash.com/docs/4.17.4#sortBy).

Your code could be like:

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)

2 Comments

You can also use the shorthand: _.sortBy(myArray, 'name')
Compared to orderBy, you can not pass sort type in sortBy, it always sorts by ascending order.
13

If you need to sort by date, you could use this solution:

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

If you are using moment library, then:

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

P.s. Note that the lodash doesn't sort dates in string format, so you must convert it to Date object.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.