JavaScript: почему Array.sort() работает неправильно?

Вопрос

Мне необходимо отсортировать массив целых чисел, чтобы они шли по порядку, но Array.sort не работает, точнее, работает неправильно. Например:

[16,13,2,5].sort() // возвращает [13, 16, 2, 5]

Это JavaScript глючит или я что-то делаю не так?


Ответ №1

Метод Array.sort() работает правильно, если знать его суть: если вызвать его без параметров, то элементы будут восприниматься как строки и сортироваться в алфавитном порядке. То есть если какой-либо элемент массива не будет являться строкой, то он будет временно преобразован в строку, после чего массив будет отсортирован по алфавиту. Поэтому, в Вашем случае строки '13' и '16' идут раньше строк '2' и '5'.

В случае, если требуется сортировать элементы массива как числа (в порядку возрастания или убывания), или же сортировать их в каком-либо другом порядке, тогда Вы должны передать в Array.sort() свою собственную функцию как параметр. Эту функцию часто называют функцией сравнения. Функция сравнения должна принять 2 параметра и вернуть:

  • отрицательное значение, если первый параметр должен предшествовать второму в отсортированном массиве;
  • положительное значение, если второй параметр должен предшествовать первому в отсортированным массиве;
  • 0, если оба параметра являются равнозначными для процесса сортировки.

Написать функцию сравнения для сортировки чисел в порядку возрастания очень просто:

function ASort (a,b) {return a-b;}

Если требуется порядок убывания:

function DSort(a,b) {return b-a;}

Теперь эти функции можно передавать в качестве параметра в Array.sort():

[16,13,2,5].sort(ASort); // Вернёт: [2,5,13,16]
[16,13,2,5].sort(DSort); // Вернёт: [16,13,5,2]

На практике часто используются намного более сложные пользовательские функции сортировки.

Нет комментариев

Добавить комментарий


(обязательно)