Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort two dimensional array using javascript

Tags:

javascript

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"]
like image 377
tonymx227 Avatar asked Dec 02 '22 10:12

tonymx227


2 Answers

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);
like image 167
gurvinder372 Avatar answered Dec 04 '22 05:12

gurvinder372


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(' ')));
like image 29
Nina Scholz Avatar answered Dec 04 '22 05:12

Nina Scholz