If compareFunction
is not supplied, all non-undefined
array elements are sorted by converting them to strings and comparing strings in UTF-16 code units order. For example, "banana" comes before "cherry". In a numeric sort, 9 comes before 80, but because numbers are converted to strings, "80" comes before "9" in the Unicode order. All undefined
elements are sorted to the end of the array.
Note: In UTF-16, Unicode characters above \uFFFF
are encoded as two surrogate code units, of the range \uD800
-\uDFFF
. The value of each code unit is taken separately into account for the comparison. Thus the character formed by the surrogate pair \uD855\uDE51
will be sorted before the character \uFF3A
.
If compareFunction
is supplied, all non-undefined
array elements are sorted according to the return value of the compare function (all undefined
elements are sorted to the end of the array, with no call to compareFunction
).
Note: compareFunction(a, b)
must always return the same value when given a specific pair of elements a
and b
as its two arguments.
So, the compare function has the following form:
function compare(a, b) {
if (a is less than b by some ordering criterion) {
return -1;
}
if (a is greater than b by the ordering criterion) {
return 1;
}
return 0;
}
Note: Applications should not rely on order of arguments or calls, as those are implementation dependent.
To compare numbers instead of strings, the compare function can subtract b
from a
. The following function will sort the array in ascending order (if it doesn't contain Infinity
and NaN
):
function compareNumbers(a, b) {
return a - b;
}
The sort
method can be conveniently used with function expressions:
const numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers);
ES2015 provides arrow function expressions with even shorter syntax.
const numbers = [4, 2, 5, 1, 3];
numbers.sort((a, b) => a - b);
console.log(numbers);
Arrays of objects can be sorted by comparing the value of one of their properties.
const items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic', value: 13 },
{ name: 'Zeros', value: 37 }
];
items.sort(function (a, b) {
return a.value - b.value;
});
items.sort(function(a, b) {
const nameA = a.name.toUpperCase();
const nameB = b.name.toUpperCase();
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
return 0;
});