Mik378
Mik378

Reputation: 22191

Sort by multiple fields in Lodash 2.x

Supposing this array:

var members = [
  {firstName: 'Michael', weight: 2}, 
  {firstName: 'Thierry', weight: 1}, 
  {firstName: 'Steph', weight: 3},
  {firstName: 'Jordan', weight: 3}, 
  {firstName: 'John', weight: 2}
];

I want to sort by weight and for each kind of weight, sorting by firstNames (a nested sort so).

Result would be:

[
  {firstName: 'Thierry', weight: 1}, 
  {firstName: 'John', weight: 2}, 
  {firstName: 'Michael', weight: 2}, 
  {firstName: 'Jordan', weight: 3}, 
  {firstName: 'Steph', weight: 3}
];

I achieve this quickly using Lodash 2.4.1:

return _.chain(members)
    .groupBy('weight')
    .pairs()
    .sortBy(function(e) {
        return e[0];
    })
    .map(function(e){
        return e[1];
    })
    .map(function(e){
        return _.sortBy(e, 'firstName')
    })
    .flatten()
    .value();

Is there a better way to achieve it using Lodash 2.4.1?

Upvotes: 4

Views: 2561

Answers (3)

Bob Sheehan
Bob Sheehan

Reputation: 160

Another variation of using lodash if you are using an older version of lodash

var members = [
{ firstName: 'Michael', weight: 2 },
{ firstName: 'Thierry', weight: 1 },
{ firstName: 'Steph', weight: 3 },
{ firstName: 'Jordan', weight: 3 },
{ firstName: 'John', weight: 2 }

];

var result = _.sortBy(members, ['firstname', 'weight'], ['asc', 'asc']);

console.log('result ', result);

Upvotes: 1

Nina Scholz
Nina Scholz

Reputation: 386660

It's even in plain Javascript very short.

var members = [
    { firstName: 'Michael', weight: 2 },
    { firstName: 'Thierry', weight: 1 },
    { firstName: 'Steph', weight: 3 },
    { firstName: 'Jordan', weight: 3 },
    { firstName: 'John', weight: 2 }
];

members.sort(function (a, b) {
    return a.weight - b.weight || a.firstName.localeCompare(b.firstName);
});

document.write('<pre>' + JSON.stringify(members, 0, 4) + '</pre>');

Upvotes: 4

floribon
floribon

Reputation: 19193

You can chain two sorts:

_(members).sortBy('firstName').sortBy('weight').value()

Upvotes: 7

Related Questions