When sorting an array of primitive values (e.g. strings or numbers), you’ll often see a lot of code that looks like this:
const arr = [8, 2, 1, 4, 5, 0];
// Sort in ascending order
.sort((a, b) => {
arrif (a > b) return 1;
if (b > a) return -1
return 0;
; // [0, 1, 2, 4, 5, 8] })
While this piece of code does the job, there is also a one-line
alternative for it. The trick hinges on
Array.prototype.sort()
expecting either a positive or a
negative value to perform a swap between two elements, thus allowing for
more flexible values than 1
and -1
. Subtracting
the numeric values in an array is sufficient and can also be used to sort
the array the other way around:
const arr = [8, 2, 1, 4, 5, 0];
// Sort in ascending order
.sort((a, b) => a - b); // [0, 1, 2, 4, 5, 8]
arr// Sort in descending order
.sort((a, b) => b - a); // [8, 5, 4, 2, 1, 0] arr
If you are working with string arrays, you should instead use
String.prototype.localeCompare()
, as it provides far greater
flexibility, by accounting for specific locales and their unique needs:
const s = ['Hi', 'Hola', 'Hello'];
// Sort in ascending order
.sort((a, b) => a.localeCompare(b)); // ['Hello', 'Hi', 'Hola']
arr// Sort in descending order
.sort((a, b) => b.localeCompare(a)); // ['Hola', 'Hi', 'Hello'] arr