Сортировка массивов в 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.

Современные тенденции и подходы в веб-разработке

Узнайте алгоритм быстрого профессионального роста с нуля в сайтостроении

Узнать подробнее
Самые свежие новости IT и веб-разработки на нашем Telegram-канале

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

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

Научиться

Метки:

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

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

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

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

  1. Павел

    Здравствуйте. Вопрос по сортировке: как отсортировать массив аргументов
    (числовые массивы) по длине? Т.е. при вызове функции указывается произвольное число массивов, потом они достаются из аргументов. Но сортировка по длине не работает,хотя, если передать массив массивов,то все хорошо.

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

Ваш 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