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

Метод 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]

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

Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.