Клавиша / esc

.sort()

Сортирует элементы массива.

Время чтения: меньше 5 мин

Кратко

Скопировано

Метод sort() сортирует элементы в массиве, изменяет порядок элементов в исходном массиве. По умолчанию сортировка выполняется в порядке возрастания. Каждый элемент массива приводятся к строке, и приведённые результаты сравниваются между собой.

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

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

Метод возвращает ссылку на исходный массив.

Пример сортировки по умолчанию

Скопировано
        
          
          const nums = [15, 0, 4]const strings = ['a', 'c', 'b']nums.sort()console.log(nums)// [0, 15, 4]strings.sort()console.log(strings)// ['a', 'b', 'c']
          const nums = [15, 0, 4]
const strings = ['a', 'c', 'b']
nums.sort()
console.log(nums)
// [0, 15, 4]
strings.sort()
console.log(strings)
// ['a', 'b', 'c']

        
        
          
        
      

Как пишется

Скопировано

Метод имеет только один опциональный параметр — функцию-компаратор sort(compareFn).

В функцию-компаратор передаются два аргумента a и b. Результат сравнения возвращаемого значения из функции с 0 определяет порядок элементов:

  • значение меньше 0 означает, что элемент a меньше, чем элемент b;
  • значение больше 0 означает, что элемент a больше, чем элемент b;
  • значение равно 0 означает, что элементы равны.

Все элементы массива со значением undefined после сортировки попадут в конец массива. Для этих элементов не будет вызываться функция compareFn().

Пример функции-компаратора для сортировки чисел

Скопировано
        
          
          function compareFn(a, b) {  if (a < b) {    return -1  } else if (a > b) {    return 1  }  // a === b  return 0}
          function compareFn(a, b) {
  if (a < b) {
    return -1
  } else if (a > b) {
    return 1
  }
  // a === b
  return 0
}

        
        
          
        
      

Так как имеет значение только знак возвращаемого значения, можно упростить:

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

        
        
          
        
      

Также можно определить с помощью стрелочной функции:

        
          
          const compareFn = (a, b) => a - b
          const compareFn = (a, b) => a - b

        
        
          
        
      

Пример сортировки чисел по возрастанию

Скопировано
        
          
          const nums = [3, 4, 0]const compareFn = (a, b) => a - bnums.sort(compareFn)console.log(nums)// [0, 3, 4]
          const nums = [3, 4, 0]
const compareFn = (a, b) => a - b

nums.sort(compareFn)

console.log(nums)
// [0, 3, 4]

        
        
          
        
      

Пример сортировки чисел по убыванию

Скопировано
        
          
          const nums = [3, 4, 0]// В отличие от сортировки по возрастанию, здесь вычитаем из второго элемента первыйconst compareFn = (a, b) => b - anums.sort(compareFn)console.log(nums)// [4, 3, 0]
          const nums = [3, 4, 0]
// В отличие от сортировки по возрастанию, здесь вычитаем из второго элемента первый
const compareFn = (a, b) => b - a

nums.sort(compareFn)

console.log(nums)
// [4, 3, 0]

        
        
          
        
      

Как понять

Скопировано

Метод sort() работает так же, как и метод toSorted(). Основное отличие в том, что метод sort() мутирует (изменяет) исходный массив, а метод toSorted() возвращает новый массив с отсортированными элементами.

        
          
          const nums = [20, 1, -10]const toSortedNums = nums.toSorted((a, b) => a - b)console.log(nums)// [20, 1, -10]console.log(toSortedNums)// [-10, 1, 20]const sortedNums = nums.sort((a, b) => a - b)console.log(nums)// [-10, 1, 20]console.log(sortedNums)// [-10, 1, 20]console.log(nums === sortedNums)// true
          const nums = [20, 1, -10]
const toSortedNums = nums.toSorted((a, b) => a - b)
console.log(nums)
// [20, 1, -10]
console.log(toSortedNums)
// [-10, 1, 20]
const sortedNums = nums.sort((a, b) => a - b)
console.log(nums)
// [-10, 1, 20]
console.log(sortedNums)
// [-10, 1, 20]
console.log(nums === sortedNums)
// true