Как отсортировать массив чисел правильно?

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Средний
#JavaScript #Массивы #База JS

Краткий ответ

Чтобы правильно отсортировать массив чисел в JavaScript, нужно использовать [sort()] с функцией сравнения. Без функции числа сортируются как строки, что приводит к неправильному результату! 🔢

const numbers = [10, 2, 30, 4];
 
// ❌ Неправильно — сортирует как строки
console.log(numbers.sort()); // [10, 2, 30, 4] — неправильно!
 
// ✅ Правильно — с функцией сравнения
console.log(numbers.sort((a, b) => a - b)); // [2, 4, 10, 30]

Полный ответ

Сортировка чисел в JavaScript — как если бы вам дали коробку с номерами, но они отсортировались по алфавиту вместо порядка! 📦❌

Проблема с sort() без функции

Метод [sort()] по умолчанию сортирует элементы как строки:

const numbers = [10, 2, 30, 4, 100];
 
// Сортировка без функции
console.log(numbers.sort()); 
// [10, 100, 2, 30, 4] — неправильно!
// Потому что '10' < '2' в строковом сравнении

Правильная сортировка чисел

Нужно передать функцию сравнения в [sort()]:

const numbers = [10, 2, 30, 4, 100];
 
// По возрастанию (меньшее к большему)
console.log(numbers.sort((a, b) => a - b)); 
// [2, 4, 10, 30, 100] — правильно!
 
// По убыванию (большее к меньшему)
console.log(numbers.sort((a, b) => b - a)); 
// [100, 30, 10, 4, 2] — правильно!

Как работает функция сравнения

Функция получает два элемента и должна вернуть:

  • Отрицательное число — первый элемент должен быть раньше
  • Положительное число — второй элемент должен быть раньше
  • Ноль — элементы равны
// Простая функция для чисел
(a, b) => a - b
 
// Это то же самое, что:
function compare(a, b) {
  if (a < b) return -1; // a раньше
  if (a > b) return 1;  // b раньше
  return 0;             // равны
}

Сортировка с сохранением оригинала

Метод [sort()] изменяет оригинальный массив:

const numbers = [3, 1, 4, 1, 5];
 
// ❌ Изменяет оригинал
numbers.sort((a, b) => a - b);
console.log(numbers); // [1, 1, 3, 4, 5] — оригинал изменился!
 
// ✅ Сохраняем оригинал
const original = [3, 1, 4, 1, 5];
const sorted = [...original].sort((a, b) => a - b);
console.log(original); // [3, 1, 4, 1, 5] — не изменился
console.log(sorted);   // [1, 1, 3, 4, 5] — новая копия

Частые ошибки

Сортировать без функции

// ❌ Неправильно
const nums = [10, 2, 30];
console.log(nums.sort()); // [10, 2, 30] — неправильно!
 
// ✅ Правильно
console.log(nums.sort((a, b) => a - b)); // [2, 10, 30]

Забыть, что sort() изменяет массив

// ❌ Ошибка — теряем оригинальный порядок
const scores = [85, 92, 78];
const sorted = scores.sort((a, b) => a - b); 
// scores и sorted — один и тот же массив!
 
// ✅ Правильно — делать копию
const scores2 = [85, 92, 78];
const sorted2 = [...scores2].sort((a, b) => a - b);

Простые правила

  1. sort() без функции — сортирует как строки, не подходит для чисел ⚠️
  2. sort((a, b) => a - b) — по возрастанию для чисел 🔼
  3. sort((a, b) => b - a) — по убыванию для чисел 🔽
  4. sort() изменяет — оригинал меняется! 🔄
  5. Копируй перед sort() — если нужен оригинал 🆕

Правильная сортировка чисел помогает избежать странных ошибок в программах! 💡


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪