О том, какая крыса метод sort()

  • четверг, 8 февраля 2018 г. в 16:44:00

Заметку пишу для того, чтобы вы знали, что метод sort() - крыса! Может заголовок вам покажется грубым, но думаю ниже вы поймете за что я его так назвал.

Скоро я запускаю видео-уроки по разработке интернет-магазина на ReactJS + Redux. К этапу завершения демо-проекта, я столкнулся с казусом.

Мне потребовалось сделать сортировку объектов по разным параметрам (цена, рейтинг, автор). Казалось бы, элементарная задача. Но я убил на неё 3 часа!

Давайте проверим ваши знания JS. Не пытайтесь бежать к гуглу или к документации. Просто дам следующий код и входные данные (массив).

Метод сортировки массива


_10
const filterBooks = (type, books) => {
_10
switch (type) {
_10
case 'DESC':
_10
return books.sort((a, b) => b - a);
_10
case 'ASC':
_10
return books.sort((a, b) => a - b);
_10
default:
_10
return books;
_10
}
_10
};

А вот входные данные:


_10
let arr = [8,7,3,2,4,5,6,1,9];
_10
filterBooks('ASC', arr); // [1,2,3,4,5,6,7,8,9]
_10
filterBooks('DESC', arr); // [9,8,7,6,5,4,3,2,1]
_10
console.log(arr); // ???

Приглядитесь внимательно на мой метод. Посмотрите, не нашли ли вы там ошибки? Вспомните как работает метод .sort().

Итак? Какой результат будет в консоли?

Ответ - [9,8,7,6,5,4,3,2,1]. Норм, да?

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

Может я чего-то не понимаю, но это неправильно мутировать исходный массив.

Да! Моя вина в том, что я не прочёл документацию как следует. Признаю, мой косяк. Но зачем? Зачем мутировать исходный массив?

В итоге применил метод orderBy из библиотеки lodash и никаких мутаций!

Я, конечно, JavaScript люблю, но это конкретный косяк.

#sort#js#javascript#сортировка#крыса