Inês
Inês

Reputation: 451

Sort an array of arrays in JavaScript

I'm trying to sort an array of arrays with integers inside, for example:

var array = [[123, 3], [745, 4], [643, 5], [643, 2]];

How can I sort it in order to return something like the following?

array = [[745, 4], [643, 2], [643, 5], [123, 3]];

Upvotes: 33

Views: 68964

Answers (6)

Fergie
Fergie

Reputation: 6235

const arr = [
  [745, 4],
  [643, 2],
  [123, 3],
  [643, 5],
];

arr.sort((a, b) => {
  for (let i = 0; i < a.length && i < b.length; i++) {
    if (a[i] === b[i]) {
      // these elements are equal, move to next element
    } else {
      // these elements are not equal so compare them
      return (a[i] + "").localeCompare(b[i] + "", undefined, {
        numeric: true,
      });
    }
  }
  return 0; // since nothing was returned, both arrays are deeply equal
}); // sort array of variable length arrays alphabetically

Upvotes: 0

Sandeep Parashar
Sandeep Parashar

Reputation: 357

A solution for the arrays with generic lengths (not limited to 2 or equal) can be as below:

var array = [[123, 3], [745, 4], [643, 5], [643, 2]];
array.sort((a,b)=>
    {
        for(let i=0;i<a.length && i<b.length;i++){
            if(a[i]!==b[i]){
                return a[i]-b[i];
            }

        }
        return a.length-b.length;
    }
)
console.log(array)

Upvotes: 4

ViAi
ViAi

Reputation: 308

If you want to sort sub array in ascending order as per first element, we can do :

arrayToSort.sort((a, b) =>a[0] - b[0]);

Upvotes: 1

Gordon Larrigan
Gordon Larrigan

Reputation: 714

You can pass a custom comparison function to Array.prototype.sort(), like so:

var sortedArray = array.sort(function(a, b) { return a - b; });

This would sort an array of integers in ascending order. The comparison function should return:

  • an integer that is less than 0 if you want a to appear before b
  • an integer that is greater than 0 if you want b to appear before a
  • 0 if a and b are the same

So, for this example you would want something like:

var sortedArray = array.sort(function(a, b) {
  return b[0] - a[0];
});

If you wanted to sort on both elements of each sub-array (ie. sort by the first element descending, then if they are the same then sort by the second element descending), you could do this:

var sortedArray = array.sort(function(a, b) {
  if (a[0] == b[0]) {
    return a[1] - b[1];
  }
  return b[0] - a[0];
});

See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort for more info.

Upvotes: 59

Ricardo Pierre-Louis
Ricardo Pierre-Louis

Reputation: 184

Assuming you want to sort by the first index in your example, the sort function exists to solve your problem.

let ans = [[123, 3], [745, 4], [643, 5], [643, 2]].sort( (a, b) => {
  return b[0] - a[0]
})

console.log(ans)

Upvotes: 9

Nenad Vracar
Nenad Vracar

Reputation: 122027

You can use sort method and first sort by first elements and then by second.

var array = [[123, 3], [745, 4], [643, 5], [643, 2]];
array.sort(([a, b], [c, d]) => c - a || b - d);
console.log(array)

Upvotes: 12

Related Questions