Я просматривал метод javaScript .sort() и запутался.
В веб-документах MDN указано (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) следующее:
- Если
compareFunction(a, b)
возвращает меньше 0, оставьтеa
иb
без изменений. - Если
compareFunction(a, b)
возвращает 0, оставьтеa
иb
неизменными по отношению друг к другу, но отсортируйте по всем различным элементам. Примечание: стандарт ECMAScript начал гарантировать такое поведение только в 2019 году, поэтому старые браузеры могут его не учитывать. - Если
compareFunction(a, b)
возвращает значение больше 0, отсортируйтеb
передa
.
И выше правило может быть записано как:
const array1 = [ 5, 3, 8 ]; // for Ascending order: console.log( array1.sort((a, b) => a - b) ); // [3, 5, 8] // for Descending order: console.log( array1.sort((a, b) => b - a) ); // [8, 5, 3]
Идеально!!!
Но когда я добавил console.log(), я обнаружил, что говорю… да?
В строке 6 я добавил console.log(), чтобы увидеть значения «a» и «b», и они оказались не такими, как я ожидал.
Это то, что я ожидал: во время первого цикла: «a»: 5 (первый элемент в массиве), «b”: 3.
Но то, что я вижу в результатах console.log:
1-я петля: «а»: 3, «б»: 5. уб ‹ 0, сохранить порядок — Результаты [3, 5, 8]
2-й цикл: «a»: 8, «b»: 3. ab › 0, отсортировать b до а — Результаты [3, 5, 8]
3-й цикл: «a»: 8, «b»: 5. ab › 0, отсортировать b до а — Результаты [3, 5, 8]
Если я сортирую [ 8, 5, 3 ], сортировка завершается в два цикла:
Итак, должен существовать алгоритм сравнения, который использует метод sort(), и я был очень удивлен, насколько он отличается от того, что я ожидал. Итак, добавил console.log(). Возможно, вы увидите что-то очень интересное.