Toggle array sorting in Javascript (ascending descending and vice versa)

I am sorting my array like this:

array.sort((function(index) {
    return function(a, b){
        return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 :1));
    };
})(0));

      

As you can see, it is sorted in ascending order.

My question is, how do I go about sorting a sort? For example, if it's already in ascending order, then how can I sort it in descending order and vice versa?

I know how to sort in descending order. I need to change the code like this:

array.sort((function(index) {
    return function(a, b) {
        return (a[index] === b[index] ? 0 : (a[index] < b[index] ? 1 :-1));
    };
})(0));

      

but i don't know how to switch.

+3


source to share


4 answers


If you know for sure that the array is sorted, you can reverse the order using a simple loop

var l = array.length;
for(i=0; i< l / 2; i++) {
   var t = array[i];
   array[i] = array[l - 1 - i];
   array[l - 1 - i] = t;
}

      

An easier solution is to use a function reverse

(BTW, check this SO Q&A for different reversing algorithms and their performance)



If you do not know the initial state of your array, I advise you to bind a custom property to an array that will keep track of the sort order. For example,

function sortArray(a, isAscending) {
  var currentSort = a["my_sort_order"];
  if (typeof currentSort != 'boolean') {
     // assume it be unsorted, use sort alogorithm
     a.sort(function(a,b) { return isAscending ? a - b : b - a; }); // assuming numerical array, modify as per your needs
  } else if (currentSort != isAscending) {
     // sorted but in different order, reverse the order
     a.reverse(); // or use for loop
  }
  // set the sort order
  a["my_sort_order"] = isAscending ? true : false;
}

      

+1


source


You were on the right track, you needed a third close to save the toggle state.

function fn(reversed){
    return function(){
        reversed = !reversed;
        return function(a,b){
            return (a==b ? 0 : a < b? -1 : 1) * (reversed ? -1 : 1);
        };
    };
};
// usage
var toggleSort = fn();
array.sort(toggleSort())

      



jsfiddle: http://jsfiddle.net/8JMuj/1/

+2


source


.reverse () always reverses the order of the array, so when switching you can just call yourSortedArray.reverse ()

var myArray = [1, 5, 8, 4, 0, 3, 6];
myArray.sort(); //[0, 1, 3, 4, 5, 6, 8]
myArray.reverse(); //[8, 6, 5, 4, 3, 1, 0]

      

+2


source


What about:

var array = [ 2,4,7,12,1,5 ];

array.toggled_sort = function () {
    var self=this;
    this.asc=!this.asc;
    return this.sort(function (l, r) {
        return l > r ? (self.asc ? 1 : -1) : l < r ? (self.asc ? -1 : 1) : 0;
    });
};

array.toggled_sort(); // ==> [ 1,2,4,5,7,12 ]
array.toggled_sort(); // ==> [ 12,7,5,4,2,1 ]
array.toggled_sort(); // ==> [ 1,2,4,5,7,12 ]
array.toggled_sort(); // ==> [ 12,7,5,4,2,1 ]
// etc.

      

+1


source







All Articles