Что такое функции высшего порядка

Ответ

Ответ не найден

Ответ 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() без компаратора, если работаешь не со строками. А то получишь хитрую жопу вместо ожидаемого результата и будешь потом полдня дебажить, ебушки-воробушки. Всё гениальное просто, но эта функция — тот ещё полупидор, который любит подставить.