Reputation: 1977
I need to sort an array in ascending order and to put all zeros in the end.
For example [0, 0, 0, 3, 2, 1] needs to be sorted to [1, 2, 3, 0, 0, 0]. This is my code, what do I need to add to make sure all zeros are at the end?
function sort_by_field(array, field){
return array.sort(function(a, b){
if( a[field] > b[field] ){
return 1;
}
if( a[field] < b[field] ){
return -1;
}
return 0;
});
}
Any help will be appreciated.
Upvotes: 11
Views: 30778
Reputation: 26558
const sortArrByCondition = (arr, func) =>
arr.sort((oA, oB) => func(oA, oB)? 1: func(oB, oA)? -1 : 0)
sortByCondition (arr, (a, b) => a > b);
sortByCondition
works well for string, number and boolean values, as well as more complex functions that return a boolean value.
Upvotes: 0
Reputation: 386604
You could take the delta of falsy values and then sort by value.
console.log([0, 0, 0, 3, 2, 1].sort((a, b) => !a - !b || a - b));
Upvotes: 4
Reputation: 6486
Just check the special cases for zero before your other comparisons. So the comparison function might look like this:
function(a, b) {
if (a === b)
return 0;
if (a === 0)
return 1;
else if (b === 0)
return -1;
//the rest of the comparison logic
}
It's vitally important for some sorting algorithms that the comparison function is super consistent, so that's why I've gone to the extra trouble of comparing both are equal at the very beginning.
Upvotes: 6
Reputation: 29836
You can do something like this:
[0, 0, 0, 3, 2, 1].sort(function(a,b){
if(a === 0) return 1;
else if(b === 0) return -1;
else return a - b;
});
Upvotes: 26