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

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

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

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

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

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

function shuffle(array) {
    for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = array;
        array = array[j];
        array[j] = temp;
    }
    return array;
}

Дан массив:

var flintstones = ["Pebbles", "Bam-Bam", "Wilma", "Fred"];

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

shuffle(flintstones);

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

> ["Wilma", "Bam-Bam", "Fred", "Pebbles"]

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

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

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

flintstones.sort();

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

> ["Bam-Bam", "Fred", "Pebbles", "Wilma"]

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

var ranValues = [ 7, 11, 12, 15, 3, 1, 10 ];

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

> [1, 10, 11, 12, 15, 3, 7]

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

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

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

sort(function(a,b){return a - b}) 

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

ranValues.sort(function(a,b){return a - b});
> [1, 3, 7, 10, 11, 12, 15]

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

ranValues.sort(function(a,b){return b - a});
> [15, 12, 11, 10, 7, 3, 1]

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

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

JavaScript&jQuery с нуля до профи

Пройдите пошаговый видеокурс по JavaScript&jQuery

Научиться

Метки:

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

Комментарии Facebook:

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree