andrey
andrey

Reputation: 1977

Array sorting with condition in Javascript

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

Answers (4)

Ben Carp
Ben Carp

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

Nina Scholz
Nina Scholz

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

ryanyuyu
ryanyuyu

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

Amir Popovich
Amir Popovich

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

Related Questions