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
  • 4,933
  • 16
  • 45
  • 81
  • 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

9

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( function(a, b) {
  return (a[0] - b[0]) || (a[1] - b[1]);
});

or without braces

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

Demo

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

console.log(myArray);
gurvinder372
  • 64,240
  • 8
  • 67
  • 88
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
  • 351,820
  • 24
  • 303
  • 358
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
  • 120,546
  • 16
  • 121
  • 140