Раньше я использовал сортировку, но обычно избегал использования необязательного аргумента функции сравнения. Пожалуйста, обратитесь к изображению выше, чтобы понять, почему я испугался. Это моя попытка глубоко погрузиться в метод сортировки, доказать себе, что мне не нужно быть «математиком», чтобы понять это, и, надеюсь, помочь другим людям, не относящимся к «математике».

Синтаксис метода сортировки:

arr.sort([compareFunction])

В документации MDN говорится о параметрах. Они перечисляют три параметра.

  1. compareFunction (необязательно)
"Specifies a function that defines the sort order. If omitted, the array elements are converted to strings, then sorted according to each character's Unicode code point value."

2. firstEl

The first element for comparison.

3. второй

The second element for comparison.

В порядке. Итак, что мы пока знаем, так это то, что есть два элемента, которые будут сравниваться, и, возможно, у нас будет функция, которая сообщает методу, КАК мы хотим их сравнивать.

Документация хороша для многих вещей, но я часто оказываюсь сбитым с толку и сбиваю с толку, потому что она никогда не упрощает вещи так, как я могу понять, если начинаю с нуля. Например, когда я впервые это прочитал, мне не было никаких указаний на то, что firstEl и secondEl работают с функцией compareFunction. Это может быть проблемой из-за того, что я неправильно интерпретирую документацию, но я не могу быть единственным.

Это моя собственная документация:

  • Сортировка - это метод массива!
  • он будет перебирать массив
  • его можно записать без аргумента [массив] .sort ()
  • при этом будет использоваться поведение сортировки по умолчанию, которое подходит для очень простых массивов, но не допускает настройки и может возвращать результаты, которых вы не ожидаете.
  • Для настройки в соответствии с вашими потребностями Sort принимает в качестве аргумента «функцию сравнения».
  • Эта «функция сравнения» имеет два параметра. Увидеть ниже:
 array            sort method
|-----||--------------------------------------------------|                                                                                           
|     ||                  compare function                |                                                               
|     ||     |--------------------------------------------|                       
|     ||     |                                            |                                                                                                                               
|     ||     |                                            |                 
[array].sort((a, b) => do something and get a return value)

Возвращаемое значение будет одним из этих трех значений и иметь один из трех результатов

  1. возвращаемое значение ‹0
  • в результате a будет помещено перед b (a, b)

2. возвращаемое значение ›0

  • в результате a будет помещен после b (b, a)
  1. значение возврата === 0
  • порядок этих элементов останется прежним (a, b)

[5, 3, 2, 13]

Допустим, мы хотим отсортировать указанный выше массив от наименьшего к наибольшему.

  • Я знаю, что 5 и 3 будут в первую очередь сравнены
  • 5 будет аргументом a, а 3 будет аргументом b
  • мы хотим вернуть положительное число, чтобы аргумент a шел после аргумента b
  • Это означает, что мы хотим, чтобы функция compareFunction возвращала a-b, потому что в этом случае это будет 5–3, что равно положительному числу.
  • Теперь наш массив [3, 5, 11, 9]
  • 5 будет аргументом a, а 11 будет аргументом b
  • 5–11 вернет отрицательное значение (-6), поэтому аргумент a (5) будет помещен перед аргументом b (11).
  • Функция компаратора будет сравнивать каждое значение со следующим до конца массива.
[5, 3, 11, 9].sort((a, b) => a-b)
// => [2, 3, 9, 11]

Я упоминал, что раньше использовал сортировку без функции компаратора. Возьмите либо массив [3, 1, 7, 4, 2], либо [«банан», «вишня», «яблоко», «асаи»]. Если вы вызываете sort для этих массивов без аргументов, они будут отсортированы в возрастающем и алфавитном порядке соответственно. Сложность усложняется при наличии массива строк со смешанным регистром или массива с двузначными числами, потому что способ сортировки метода основан на использовании значений Unicode. Я не собираюсь углубляться в Unicode, но дело в том, что без функции компаратора функция сортировки по умолчанию очень ограничивает. Итак, в конечном итоге нам нужно будет использовать три аргумента, которые принимает sort.

Если вы хотите провести собственное сравнение, вам придется написать функцию компаратора. Вот почему это считается функцией высшего порядка, потому что функция сортировки ожидает в качестве аргумента другую функцию. ТАК.

Функция компаратора принимает два элемента и возвращает положительное или отрицательное число. Ваша работа - выяснить, какое из них идет раньше другого.

возвращаемое значение компаратора ‹0

// = ›а идет первым

возвращаемое значение компаратора ›0

// = ›b идет первым

возвращаемое значение компаратора === 0

// = ›порядок без изменений