Метод .sort() немного отличается от того, что вы ожидаете. Возьмем массив и применим к нему метод

let array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);

Таким образом, мы ожидаем, что вывод должен быть

[ 1, 4, 21, 30, 100000 ]

но происходит следующее

[ 1, 100000, 21, 30, 4 ]

Функция сравнения

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

All non-undefined array elements are sorted by converting them to strings and comparing strings in UTF-16 code units order. For example, "banana" comes before "cherry". In a numeric sort, 9 comes before 80, but because numbers are converted to strings, "80" comes before "9" in the Unicode order.

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

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

Теперь посмотрите, как работает приведенный выше код с помощью функции compareFunction.

let array1 = [1, 30, 4, 21, 100000];
array1.sort(compareFunction);
console.log(array1);
[ 1, 4, 21, 30, 100000 ]

Что именно происходит

Когда функция sort() сравнивает два значения, она отправляет значения в функцию сравнения и сортирует значения в соответствии с возвращенным значением (отрицательным, нулевым, положительным).

  1. Если результат отрицательный, a сортируется перед b.
  2. Если результат положительный, b сортируется перед a.
  3. Если результат равен 0, порядок сортировки двух значений не изменяется.

Например,

When comparing 40 and 100, the sort() method calls the compare function(40, 100). The function calculates 40 - 100 (a - b), and since the result is negative (-60),  the sort function will sort 40 as a value lower than 100.

Итак, чтобы получить массив в порядке убывания, нам просто нужно изменить возвращаемое значение как b-a

// This will give a Descending order array
function comparFunction(a,b){ return b-a }

compareFunction для массива объектов

Таким образом, массив объектов ничем не отличается от массива чисел или массива строк. В приведенном выше примере a и b — не что иное, как числовые типы данных. Итак, теперь это будет объект.

var Staff = [{
  "id": 1,
  "name": "Joellyn Manktelow"
}, {
  "id": 10,
  "name": "Roxine MacGorley"
},{
  "id": 3,
  "name": "Taddeusz Colthard"
}, {
  "id": 4,
  "name": "Elysia Drains"
}, {
  "id": 6,
  "name": "Curtice Curragh"
}, {
  "id": 7,
  "name": "Dael Sylett"
}, {
  "id": 2,
  "name": "Lorin Janak"
}, {
  "id": 8,
  "name": "Patty Matuschek"
}, {
  "id": 9,
  "name": "Kandace Sorensen"
}, {
  "id": 5,
  "name": "Rona Cresser"
}];

Затем мы можем использовать тип данных a.id или число. Следовательно, мы можем сортировать по имени или идентификатору.

// when we want to sort using id
console.log('when we want to sort using id') 
Staff.sort(function(a, b){return a.id - b.id}); 
console.log(Staff)
when we want to sort using id
[
  { id: 1, name: 'Joellyn Manktelow' },
  { id: 2, name: 'Lorin Janak' },
  { id: 3, name: 'Taddeusz Colthard' },
  { id: 4, name: 'Elysia Drains' },
  { id: 5, name: 'Rona Cresser' },
  { id: 6, name: 'Curtice Curragh' },
  { id: 7, name: 'Dael Sylett' },
  { id: 8, name: 'Patty Matuschek' },
  { id: 9, name: 'Kandace Sorensen' },
  { id: 10, name: 'Roxine MacGorley' }
]

Но если вы хотите отсортировать по имени или строковому типу данных, лучше всего использовать String.prototype.localeCompare() для сравнения двух строк. давайте возьмем приведенный выше массив сотрудников

// when we want to sort using id
console.log('when we want to sort using Name') 
Staff.sort(function(a, b){return a.name.localeCompare(b.name)}); 
console.log(Staff)
when we want to sort using Name
[
  { id: 6, name: 'Curtice Curragh' },
  { id: 7, name: 'Dael Sylett' },
  { id: 4, name: 'Elysia Drains' },
  { id: 1, name: 'Joellyn Manktelow' },
  { id: 9, name: 'Kandace Sorensen' },
  { id: 2, name: 'Lorin Janak' },
  { id: 8, name: 'Patty Matuschek' },
  { id: 5, name: 'Rona Cresser' },
  { id: 10, name: 'Roxine MacGorley' },
  { id: 3, name: 'Taddeusz Colthard' }
]

Таким образом, для сравнения двух строк мы можем использовать метод localeCompare строкового типа данных, который возвращает отрицательное число, если a.first_name встречается до b.first_name, положительное, если a.first_name встречается после b.first_name; 0, если они эквивалентны.

Спасибо!!