Search code examples
javascriptsortinglodash

Sorting an array of objects by 'desc' with numbers first


I'm trying to sort an array of objects by descending and beginning with number first, here's what I'm having:

var users = [
  { 'user': 'fred',   'a': 48 },
  { 'user': 'barney', 'a': 'b' },
  { 'user': 'fred',   'a': 40 },
  { 'user': 'barney', 'a': 'c' }
];
_.orderBy(users, 'a', 'desc');

result:

0: Object {a: "b", user: "barney"}
1: Object {a: "c", user: "barney"}
2: Object {a: 48, user: "fred"}
3: Object {a: 40, user: "fred"}

expected result:

0: Object {a: 48, user: "fred"}
1: Object {a: 40, user: "fred"}
2: Object {a: "b", user: "barney"}
3: Object {a: "c", user: "barney"}

Solution

  • You can provide multiple sort keys ("iteratees") and the order for each key

    _.orderBy(users, [x => isNaN(x.a), 'a'], ['asc', 'desc']);
    

    This will, however, sort the strings descending as well (that is, the result will be 48, 40, c, b.

    var users = [
      { 'user': 'x',   'a': 'a' },
      { 'user': 'x',   'a': 948 },
      { 'user': 'x',   'a': 48 },
      { 'user': 'x',   'a': -480 },
      { 'user': 'x',   'a': 'c' },
      { 'user': 'x',   'a': 548 },
      { 'user': 'x',   'a': 4558 },
      { 'user': 'x',   'a': 148 },
      { 'user': 'x',   'a': 4834534 },
      { 'user': 'x',   'a': 1 },
      { 'user': 'x',   'a': 'b' },
    ];
    
    users = _.orderBy(users, [x => isNaN(x.a), 'a'], ['asc', 'desc']);
    console.log(users)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>