4

I am using underscore to sort an array. Is there a way to make nulls always last whether ascending or descending? For example:

[
    { name: 'a', age: 1 }, 
    { name: 'z', age: 5 }, 
    { name: '', age: 1 }, 
    { name: 'v', age: 7 }
]

Will produce

[
    { name: 'a', age: 1 }, 
    { name: 'v', age: 7 }, 
    { name: 'z', age: 5 }, 
    { name: '', age: 1 }
]

and descending will produce:

[
    { name: 'z', age: 5 }, 
    { name: 'v', age: 7 }, 
    { name: 'a', age: 1 }, 
    { name: '', age: 1 }
]

My real array is an array of objects so i have to pluck values out.

Evgeniy
  • 2,915
  • 3
  • 21
  • 35
Luke101
  • 63,072
  • 85
  • 231
  • 359

3 Answers3

6

There are many ways to go about it but you could try something like this:

var arr = [{name: 'a', age: 1}, {name: 'z', age: 5}, {name: '', age: 1}, {name: 'v', age: 7 }];

_.chain(arr)
 .sortBy('name')
 //.reverse() // to sort descending
 .partition('name')
 .flatten()
 .value();

Result:

[ { name: 'a', age: 1 },
  { name: 'v', age: 7 },
  { name: 'z', age: 5 },
  { name: '', age: 1 } ]
istos
  • 2,654
  • 1
  • 17
  • 19
1

You can do this with lodash, and im think underscore as this function too.

var users =[{name: 'a', age: 1}, {name: '', age: 4}, {name: 'z', age: 5}, {name: '', age: 1}, {name: 'v', age: 7 }];

_.sortBy(users, 'name');

The results will give you the null names in the beginning:

[{name: '', age: 1}, {name: '', age: 4}, {name: 'a', age: 1}, {name: 'z', age: 5}, {name: 'v', age: 7 }];
Bazinga
  • 10,716
  • 6
  • 38
  • 63
0

You could simply find them after sorting and put them in the back manually. Maybe by splitting the different values in 2 arrays and then concatenating them. One of the arrays contains non null values and the other the null values

Kokozaurus
  • 639
  • 7
  • 22