Сортировка массивов в JavaScript

Сортировка массивов в JavaScript

От автора: говорят, что с компьютерами связаны две основные проблемы: устаревание кэша и проблема именования. К ним я могу добавить третью проблему: сортировка и изменение приоритета. К нашей великой радости, умы всего мира уже решили похожие задачи.

В скриптах довольно часто требуется перемешать или отсортировать что-либо: к примеру, рейтинг каких-либо баллов или случайная перемешка значений в игре. К сожалению, в JavaScript до сих пор не появился встроенный метод перемешивания элементов, а сортировка работает с глюками… однако оба метода можно реализовать самому, если знать как.

Перетасовка массива

Тему перетасовки я затрагивал ранее в своей статье о том, как создать генератор случайных чисел в JavaScript: в статье рассказывается про высокопроизводительный метод тасования Фишера–Йетса:

Дан массив:

Перемешать его можно с помощью:

И получим мы что-то типа (в консоли):

Результат будет всегда перемешиваться в случайном порядке.

Сортировка массива

Для сортировки массивов можно использовать метод sort:

… данный метод отсортирует элементы массива в алфавитном порядке:

Однако при попытке отсортировать числа, метод ведет себя не совсем так, как надо:

В результате получим следующий массив:

Почему это происходит?

По умолчанию сортировка работает в лексикографическом порядке, т.е. в режиме словарной сортировки. Это же распространяется и на числа: метод конвертирует числа массива в строки и сортирует их. По такой системе 3 будет стоять перед 30, что уже вызывает вопросы.

Для решения данной задачи в метод sort можно передавать функцию, в которой будет контролироваться процесс сортировки. Для корректной сортировки чисел используйте:

Функция принимает 2 значения из массива, a и b. Возвращается одно из трех значений: -1 – a меньше b, т.е. a должно быть перед b; 0 – значения равны, ничего менять не нужно; 1 – a должно быть после b. Применив данную функцию к нашему примеру, можно получить:

Для сортировки в обратном порядке поменяйте a и b местами:

Источник: //thenewcode.com/

Редакция: Команда webformyself.

Метки:

Похожие статьи:

Комментарии Вконтакте:

Комментарии (2)