По умолчанию метод массива sort()
сортирует по алфавиту по возрастанию. Если вы хотите выполнить сортировку в другом порядке, поскольку ваш массив содержит числа или объекты, вы можете передать функцию в sort()
.
Функция, которую вы передаете, принимает два параметра, часто называемые a и b, и возвращает:
отрицательное число, если первый аргумент должен быть отсортирован перед вторым (a b)
Теперь - это бит ключа : функция, которую вы передаете в качестве параметра sort()
, будет повторно вызываться sort()
, поскольку она обрабатывает весь массив. sort()
не знает и не заботится о типе данных в массиве: каждый раз, когда ему нужно знать, "предшествует ли элемент A элементу B?" это просто вызывает вашу функцию. Вам не нужно беспокоиться о том, какой тип алгоритма сортировки используется внутри sort()
, действительно, один браузер может использовать другой алгоритм для другого, но это нормально, потому что вам просто нужно предоставить способ для сравнения любых двух элементов. из вашего массива.
Ваша функция может иметь структуру if / else if / else
, чтобы решить, какой результат вернуть, но для чисел простое возвращение (ab) достигнет этого за вас, потому что результатом вычитания будет -ve, 0 или + ve и правильно поставлено числа в порядке возрастания. Возвращение (б-а) поставит их по убыванию:
var sortedArray = myArray.sort(function(a,b){
return (a-b);
});
Если у вас есть массив объектов и вы хотите отсортировать какое-то конкретное свойство или свойства объектов, вы можете сделать это тоже. Предположим, например, объекты в этом формате:
{ id : 1,
name : "Fred",
address : "12 Smith St",
phone : "0262626262" }
Затем вы можете отсортировать массив таких объектов по их атрибуту 'id' следующим образом:
var sortedArray = myArray.sort(function(a,b){
return (a.id - b.id);
});
Или вы можете отсортировать массив таких объектов по их атрибуту name (в алфавитном порядке) следующим образом:
var sortedArray = myArray.sort(function(a,b){
if (a.name < b.name)
return -1;
else if (a.name == b.name)
return 0;
else
return 1;
});
Обратите внимание, что в моем последнем примере я поместил полную структуру if / else if / else
, о которой я упоминал ранее.
Для примера, где вы сортируете объекты с несколькими свойствами, вы можете расширить это, включив в него вторичную сортировку, то есть (в моем примере), если свойства имени равны, вы можете затем сравнить, скажем, телефон собственности.