От автора: говорят, что с компьютерами связаны две основные проблемы: устаревание кэша и проблема именования. К ним я могу добавить третью проблему: сортировка и изменение приоритета. К нашей великой радости, умы всего мира уже решили похожие задачи.
В скриптах довольно часто требуется перемешать или отсортировать что-либо: к примеру, рейтинг каких-либо баллов или случайная перемешка значений в игре. К сожалению, в JavaScript до сих пор не появился встроенный метод перемешивания элементов, а сортировка работает с глюками… однако оба метода можно реализовать самому, если знать как.
Перетасовка массива
Тему перетасовки я затрагивал ранее в своей статье о том, как создать генератор случайных чисел в JavaScript: в статье рассказывается про высокопроизводительный метод тасования Фишера–Йетса:
1 2 3 4 5 6 7 8 9 |
function shuffle(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } |
Дан массив:
1 |
var flintstones = ["Pebbles", "Bam-Bam", "Wilma", "Fred"]; |
Перемешать его можно с помощью:
1 |
shuffle(flintstones); |
И получим мы что-то типа (в консоли):
1 |
> ["Wilma", "Bam-Bam", "Fred", "Pebbles"] |
Результат будет всегда перемешиваться в случайном порядке.
Сортировка массива
Для сортировки массивов можно использовать метод sort:
1 |
flintstones.sort(); |
… данный метод отсортирует элементы массива в алфавитном порядке:
1 |
> ["Bam-Bam", "Fred", "Pebbles", "Wilma"] |
Однако при попытке отсортировать числа, метод ведет себя не совсем так, как надо:
1 |
var ranValues = [ 7, 11, 12, 15, 3, 1, 10 ]; |
В результате получим следующий массив:
1 |
> [1, 10, 11, 12, 15, 3, 7] |
Почему это происходит?
По умолчанию сортировка работает в лексикографическом порядке, т.е. в режиме словарной сортировки. Это же распространяется и на числа: метод конвертирует числа массива в строки и сортирует их. По такой системе 3 будет стоять перед 30, что уже вызывает вопросы.
Для решения данной задачи в метод sort можно передавать функцию, в которой будет контролироваться процесс сортировки. Для корректной сортировки чисел используйте:
1 |
sort(function(a,b){return a - b}) |
Функция принимает 2 значения из массива, a и b. Возвращается одно из трех значений: -1 – a меньше b, т.е. a должно быть перед b; 0 – значения равны, ничего менять не нужно; 1 – a должно быть после b. Применив данную функцию к нашему примеру, можно получить:
1 2 |
ranValues.sort(function(a,b){return a - b}); > [1, 3, 7, 10, 11, 12, 15] |
Для сортировки в обратном порядке поменяйте a и b местами:
1 2 |
ranValues.sort(function(a,b){return b - a}); > [15, 12, 11, 10, 7, 3, 1] |
Источник: //thenewcode.com/
Редакция: Команда webformyself.
Комментарии (2)