Сортировка массива JavaScript с помощью array.sort()

Сортировка массива JavaScript с помощью array.sort()

Последнее обновление: 17 августа 2016 г.

Сортировка массивов в JavaScript выполняется с помощью метода array.sort() , метод, который, вероятно, так же неправильно понят, как и недооценен. При вызове sort() сама по себе просто сортирует массив в лексикографическом (он же алфавитном) порядке, небо на самом деле ограничение, как только вы выходите за пределы поверхности.

Сортировка массив в лексикографическом порядке

Сортировка массива лексикографически (то есть «по алфавиту» или в словарном порядке) это легко сделать. Просто вызовите array.sort() без переданных параметров:

 //Сортировка по алфавиту и возрастанию:
var myarray=["Боб", "Хулиган", "Эми"]
myarray.sort() // Массив теперь становится ["Amy", "Bob", "Bully"] 

Обратите внимание, что порядок восходящий.

Чтобы сделать это по убыванию вместо этого проще всего заручиться помощью другого метода Array в комбинация, array.reverse() :

 // Сортировать по алфавиту и по убыванию:
var myarray=["Боб", "Хулиган", "Эми"]
моймассив.sort()
myarray.reverse() // Массив теперь становится ["Bully", "Bob", "Amy"] 

Теперь, прежде чем вы начнете чувствовать себя комфортно, подумайте, что произойдет, если мы вызовем array.sort() для массива, состоящего из числа:

 переменная myarray=[7, 40, 300]
myarray.sort() // Массив теперь становится [300,40,7] 

Хотя 7 численно меньше, чем 40 или 300, лексикографически он больше, поэтому 7 появляется в самом правом углу отсортированный массив. Помните, по умолчанию

array.sort() сортирует его элементы в лексикографическом порядке.

И вот он с array.sort() в условиях его основного использования. Но в этом методе гораздо больше, чем кажется глаз. Array.sort() принимает необязательный параметр в форме ссылки на функцию, которая в значительной степени позволяет вам сортировать массив на основе любого настраиваемые критерии, такие как численная сортировка массива или его перемешивание (рандомизация порядок его элементов).

Прохождение в ссылке на функцию в array.sort()

Как уже упоминалось, array.sort() принимает необязательный параметр в виде функции ссылка (назовем ее sortfunction ). Формат этого функция выглядит так:

 function sortfunction(a, b){
// Сравните каким-либо образом "a" и "b" и верните -1, 0 или 1
}
array.sort(sortfunction) 

Когда такая функция передается в array.sort() , массив элементы сортируются на основе отношения между каждой парой элементов a » и » b » и возвращаемое значение функции. три возможных возвращаемых номера:

<0 (меньше 0), 0 , или >0 (больше 0):

  • Меньше 0 : Сортировать " a " так, чтобы он был меньшим индексом, чем " b "
  •   Ноль : " a " и " b " должны быть считаются равными, и сортировка не выполняется.
  •   Больше 0 : Сортировать " b "для более низкого индекса чем " и ".

Например, для сортировки массива по возрастанию и числовому тело вашей функции будет выглядеть так:

 function sortfunction(a, b){ //вызывает сортировку массива по числам и по возрастанию
возврат (а - б)
} 

Подробнее об этом ниже.

Сортировка массив в числовом порядке

Чтобы отсортировать массив в числовом порядке, просто передайте пользовательский функция сортировки на array.sort() , который возвращает разница между " a " и " b ", два параметра косвенно/автоматически передается в функцию:

 //Сортировка по цифрам и возрастанию:
вар myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){ //Теперь массив становится [7, 8, 25, 41]
вернуть а - б
}) 

Это работает именно так, потому что всякий раз, когда "

a " меньше " b ", возвращается отрицательное значение, в результате чего в более мелких элементах, всегда появляющихся слева от более крупных, в другими словами, восходящий. Обратите внимание, что мы определили нашу функцию сортировки в этом случае прямо внутри метод sort() как анонимная функция, вместо того, чтобы создавать явную функцию и передавать ее в sort() - оба выполняют одно и то же.

Сортировка массива численно, но не по убыванию разные, и просто требуется поменять местами два операнда "

a " и " b ":

 //Сортировка по числам и по убыванию:
вар myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){ //Массив теперь становится [41, 25, 8, 7]
    вернуть б - а
}) 
перетасовка (рандомизация) порядка массива

Чтобы рандомизировать порядок элементов в массиве, что нам нужно тело нашей функции сортировки , чтобы вернуть число, которое случайно <0 , 0 или >0 , независимо от отношения между « a » и « b ». Ниже показано, как это сделать:

 //Случайный порядок массива:
var myarray=[25, 8, "Джордж", "Джон"]
myarray.
sort(function(){ //элементы массива теперь зашифрованы вернуть 0,5 - Math.random() })

Интерактивная демонстрация: Сортировка или рандомизация элементов массива.

Как видите, array.sort() — это гораздо больше. чем многие могут подумать. На самом деле, вы даже можете сортировать массивы, которые содержат больше не просто примитивные значения, а объекты со свойствами. Давайте посмотрим, что дальше.

  • Введение в учебник
  • Сортировка массива объектов
  • Пример — сортировщик чисел и слов

Сортировка Массив объектов

Сортировка массива объектов

Сортировка массива объектов

Сделав еще один шаг вперед, скажем, ваш массив не содержат только простые числовые или строковые значения, но объекты со свойствами вместо этого:

 var сотрудников=[]
сотрудников[0]={имя:"Джордж", возраст:32, на пенсии:"12 марта 2014 г. "}
сотрудников[1]={имя: «Эдвард», возраст: 17 лет, дата выхода на пенсию: «2 июня 2023 г.»}
сотрудников[2]={имя:"Кристина", возраст:58, на пенсии:"20 декабря 2036"}
сотрудников[3]={имя:"Сара", возраст:62, на пенсии:"30 апреля 2020"} 

Массив сотрудников выше представляет собой массив объекты со свойствами различных типов данных, от строковых, числовых до строка даты. Метод sort() можно использовать для сортировки массива. на основе значений одного из этих свойств, таких как сортировка массива по имя, возраст или даже выход на пенсию. Основная идея состоит в том, чтобы изменить сравнение функция, поэтому она сравнивает значения желаемых свойств. Давайте посмотрим, как это работает сейчас.

- Сортировать по возрасту сотрудника

Давайте начнем с сортировки массива сотрудников

по их возраст (по возрастанию). Вот функция сравнения, которая делает это:

 employee.sort(function(a, b){
вернуть a. age-b.age
}) 

С помощью описанного выше метода сортировки массив сотрудников теперь отсортировано по свойству age , поэтому employee[0] «Эдвард», сотрудник [1] — «Джордж» и т. д. Процесс очень аналогично сортировке массива с числовыми значениями (по возрастанию), за исключением того, что вычитания b из a, нам нужно вместо этого вычесть b.age из a.age, или свойство элемента массива, на котором мы хотим основывать сортировку.

- Сортировка по имени сотрудника

Сортировка по возрасту сотрудника может показаться незначительной бесчувственны в наши дни, поэтому давайте вместо этого будем называть имена сотрудников (Восходящий). Напомним, что по умолчанию для сортировки массива, содержащего примитив значений (таких как строки) в алфавитном порядке, вы просто вызовете sort() метод без какой-либо функции сравнения, переданной непосредственно в массив, такой как myarray. sort() . Однако это не работает, когда данные, которые мы хотите отсортировать, используя глубоко внутри свойства объекта массива, а не сам массив. Так что делать? Ну, хитрость заключается в том, чтобы вручную определить функция сравнения, которая сортирует массив по алфавиту, что, в свою очередь, позволяет нам указать, где находятся эти строковые данные. Взгляни на следующее:

 служащие. сортировка (функция (а, б) {
переменная nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase()
если (имяА имяБ)
вернуть 1
return 0 // возвращаемое значение по умолчанию (без сортировки)
}) 

Это отсортирует массив сотрудников по имени свойство по возрастанию, поэтому employee[0] «Кристина», сотрудник[1] это «Эдвард» и так далее. Здесь мы сравниваем две строки a.name с b.name и возвращаем либо -1, 1, либо 0 соответственно для сортировки, точно формула, неявно используемая сортировка() метод без какой-либо переданной функции. И, как вы, возможно, только что обнаружил, что в JavaScript вы, безусловно, можете сравнить две строки (сделано так по алфавиту).

- Сортировать по дате (дате выхода на пенсию)

Наконец, допустим, вы хотите отсортировать сотрудников на основе дата выхода на пенсию каждого работника. Эта информация хранится в « retiredate ». свойство, хотя для того, чтобы сделать вещи более интересными, не как объект даты, а строка, представляющая дату. Что нам нужно сделать в первую очередь, так это создать допустимый объект даты из этой строки сначала, хотя впоследствии процесс то же самое, что и сортировка по номерам:

 служащие. сортировка (функция (а, б) {
var dateA=новая дата(a.retiredate), dateB=новая дата(b.retiredate)
return dateA-dateB //сортировать по дате по возрастанию
}) 

Это сортирует массив таким образом, что работники, выходящие на пенсию раньше всех, появляются первыми ( сотрудников [0] равно "Сара").