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

Дата: 08.02.2018 в 19:44, Категория: Заметки
  • 45
  • 0
О том, какая крыса метод sort()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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