Ответ
Ответ не найден
Ответ 18+ 🔞
А, ну это же классика, ёпта! Смотри, есть такая штука — Array.prototype.sort(). Ну, вроде бы всё просто: вызвал метод у массива, он его отсортировал. Ан нет, блядь! Тут подвох, как в дешёвой водке — с виду прозрачная, а на утро голова болит, и соседка твоя жена.
Вот смотри, примерчик простой, казалось бы:
const arr = [1, 2, 10, 20];
arr.sort();
console.log(arr); // [1, 10, 2, 20]
Удивление пиздец! Где логика, спрашивается? А логика в том, что по умолчанию sort приводит всё к строкам и сортирует лексикографически, по юникоду. Для строк '10' идёт раньше, чем '2', потому что сравниваются первые символы '1' и '2'. Вот тебе и манда с ушами вместо сортировки чисел.
Чтобы не бздеть каждый раз, нужно передать функцию-компаратор. Для чисел — элементарно:
const arr = [1, 2, 10, 20];
arr.sort((a, b) => a - b);
console.log(arr); // [1, 2, 10, 20] — вот теперь красота!
А теперь представь, сортируешь ты массив объектов. Допустим, пользователей по возрасту.
const users = [
{ name: 'Вася', age: 30 },
{ name: 'Петя', age: 18 },
{ name: 'Маша', age: 25 }
];
// Хочешь по возрасту — делай так, а не как последний распиздяй
users.sort((a, b) => a.age - b.age);
Главное помнить — метод мутирует исходный массив. То есть старый порядок накрылся медным тазом безвозвратно. Если нужно оставить оригинал, сначала сделай копию, например, через spread: [...arr].sort(...).
А ещё там есть нюансы со стабильностью сортировки. Раньше в некоторых движках она могла быть нестабильной (одинаковые элементы прыгали как угорелые), но в современных спецификациях ECMAScript её зафигачили стабильной. Но если пишешь код, который может запускаться в древнем окружении, имей в виду — доверия ебать ноль.
Короче, мораль простая: никогда не используй sort() без компаратора, если работаешь не со строками. А то получишь хитрую жопу вместо ожидаемого результата и будешь потом полдня дебажить, ебушки-воробушки. Всё гениальное просто, но эта функция — тот ещё полупидор, который любит подставить.