4

I'd like to sort a two dimensional array using javascript.

My array :

[
  ['1','6'],
  ['1','5'],
  ['2','3'],
  ['0','4'],
]

My sorting function :

// 1st sort
myArray.sort( function(a, b) {
  return a[0] - b[0];
});

// 2nd sort
myArray.sort( function(a, b) {
  return a[1] - b[1];
});

The result :

["2", "3"]
["0", "4"]
["1", "6"]
["1", "5"]

The result should be :

["0", "4"]
["1", "5"] // 5 before 6 and the left column is sorted
["1", "6"]
["2", "3"]
tonymx227
  • 5,293
  • 16
  • 48
  • 91
  • Try this: https://stackoverflow.com/questions/16096872/how-to-sort-2-dimensional-array-by-column-value – Kannan K Jan 12 '18 at 10:16

3 Answers3

11

Your second sort is overriding the sorting done by first sort and it is only keeping the second column sorted.

You don't need two sort functions, just include both in a single sort as:

myArray.sort((a, b) => (a[0] - b[0]) || (a[1] - b[1]));

or without braces

myArray.sort((a, b) => a[0] - b[0] || a[1] - b[1]);

Demo

var myArray = [
    ['1','6'],
    ['1','5'],
    ['2','3'],
    ['12','13'],
    ['0','4'],
];
myArray.sort((a, b) => (a[0] - b[0]) || (a[1] - b[1]));

console.log(myArray);
Det
  • 3,640
  • 5
  • 20
  • 27
gurvinder372
  • 66,980
  • 10
  • 72
  • 94
6

You could use a different approach for an arbitrary length of the arrays.

This solution assumes, that all inner arrays have the same length.

var array = [['1','6', '1'], ['1','5', '1'], ['1','5', '2'], ['2','3', '0'], ['0','4', '0']];

array.sort(function (a, b) {
    var d;
    a.some((v, i) => d = v - b[i]);
    return d;
});

console.log(array.map(a => a.join(' ')));
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
3
 myArray.sort((a, b) => (a[0] - b[0]) || (a[1] - b[1]));

Just sort after the second slot if the first ones are equal

Jonas Wilms
  • 132,000
  • 20
  • 149
  • 151