Поведение по умолчанию для Array.prototype.sort () в Javascript может не соответствовать вашим ожиданиям, если не предусмотрена функция сравнения.
Недавно мне нужно было отсортировать массив целых чисел в Javascript в порядке возрастания, и я достиг Array.prototype.sort()
.
const array = [0, 2, 1, -2, -1] array.sort() //expected result: [-2, -1, 0, 1, 2]
Я использовал эту функцию много раз и никогда не сталкивался с какими-либо проблемами. Я знаю, что вы можете передать функцию сравнения в качестве необязательного параметра для настройки поведения сортировки, то есть array.sort([compareFunction])
. Но для простых старых целых чисел сортировки по возрастанию предположение было излишним.
Как я был неправ! Значение array
после сортировки было:
[ -1, -2, 0, 1, 2 ]
Пора обратиться к официальной документации:
По умолчанию используется возрастающий порядок сортировки, основанный на преобразовании элементов в строки и последующем сравнении их последовательностей значений кодовых единиц UTF-16.
Получается, что без явной функции сравнения Javascript будет обрабатывать все элементы массива как строки! Тот факт, что массив содержит только данные типа number
, очевиден. Это действительно имеет смысл, поскольку Javascript - динамический язык. Он не просит вас объявить тип данных для массива при объявлении, чтобы он не знал о вашем намерении. Каждый элемент в массиве может относиться к любому типу данных, поэтому Javascript должен работать с наименьшим общим знаменателем.
Как только все стало ясно, исправить это было действительно очень просто. Вот как правильно отсортировать массив чисел в Javascript по возрастанию:
const array = [0, 2, 1, -2, -1] array.sort((a, b) => a - b) //[-2, -1, 0, 1, 2]
Вы раньше сталкивались с таким поведением?