Заметку пишу для того, чтобы вы знали, что метод sort()
- крыса! Может заголовок вам покажется грубым, но думаю ниже вы поймете за что я его так назвал.
Скоро я запускаю видео-уроки по разработке интернет-магазина на ReactJS + Redux. К этапу завершения демо-проекта, я столкнулся с казусом.
Мне потребовалось сделать сортировку объектов по разным параметрам (цена, рейтинг, автор). Казалось бы, элементарная задача. Но я убил на неё 3 часа!
Давайте проверим ваши знания JS. Не пытайтесь бежать к гуглу или к документации. Просто дам следующий код и входные данные (массив).
_10const 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};
А вот входные данные:
_10let arr = [8,7,3,2,4,5,6,1,9];_10filterBooks('ASC', arr); // [1,2,3,4,5,6,7,8,9]_10filterBooks('DESC', arr); // [9,8,7,6,5,4,3,2,1]_10console.log(arr); // ???
Приглядитесь внимательно на мой метод. Посмотрите, не нашли ли вы там ошибки? Вспомните как работает метод .sort()
.
Итак? Какой результат будет в консоли?
Ответ - [9,8,7,6,5,4,3,2,1]. Норм, да?
Казалось бы, обычный метод .sort()
, который просто сортирует массив и выдает новый отсортированный результат. Но дело в том, что метод .sort()
сортирует и также мутирует исходный массив.
Может я чего-то не понимаю, но это неправильно мутировать исходный массив.
Да! Моя вина в том, что я не прочёл документацию как следует. Признаю, мой косяк. Но зачем? Зачем мутировать исходный массив?
В итоге применил метод orderBy
из библиотеки lodash и никаких мутаций!
Я, конечно, JavaScript люблю, но это конкретный косяк.