javascriptalgorithmsorting

How can I ensure a stable array.sort() order, javascript


How can I ensure a stable .sort() order across all browsers? JavaScript

I have an array of objects, eg

[{
 thing: 'walker',
 value: 1
},
{
 thing: 'texas',
 value: 2
},
{
 thing: 'ranger',
 value: 2
}]

When sorting the array I sort them alternating asc/desc using:

 _sortNumber (key, dir) {
    return function(a, b) {
      if (dir) {
        // sort descending
        return b[key] - a[key];
      }
      else {
        // sort ascending
        return a[key] - b[key];
      }
    }
  };

array.sort(this._sortNumber('value', Boolean));

However, the order of texas and ranger seem to randomly change. I believe due to the fact that they are the same number, however, I would like it to be consistent.

How can I ensure consistency; or sort on a secondary value (eg thing alphabetically), in order to ensure I always get the same sort result?


Solution

  • First of all, like Array#sort and other sort implementations:

    The sort is not necessarily stable.

    To maintain a stable sort, you could use a unique value, like an index as last sort value in the chain of sorting criteria, like

    function asc(key) {
        return function (a, b) {
            return a[key] - b[key] || a.id - b.id;
        };
    }
    
    array.sort(asc('value'));