Описание алгоритма:
Функция filteredCourses() принимает в качестве двух параметров массив с курсами (courses) и диапазон цен (requiredRange), если у заданного диапазона цен второй элемент массива равен null, то функция приравнивает его к бесконечности.
Затем, функция возвращает отфильтрованный массив с курсами: если у курса в свойстве prices второй элемент массива равен null, то фильтр сравнивает первый элемент массива заданного диапазона цен (requiredRange[0]) с первым элементом массива цен курса (course.prices[0]) и выясняет равен ли второй элемент заданного диапазона цен (requiredRange[1]) бесконечности (Infinity).
В другом случае фильтр сравнивает первый элемент заданного диапазона цен(requiredRange[0]) с первым элементом массива цен курса (course.prices[0]) и сравнивает второй элемент массива диапазона цен(requiredRange[1]) со вторым элементом массива цен курса (course.prices[1]).
Если условие соблюдается, т.е. диапазон цен курса находится в границах заданного диапазона, то фильтр оставляет этот курс.
Функция SortCourses() принимает в качестве параметра массив с курсами и возвращает отсортированный массив, используя метод sort, который сортирует курсы в порядке возрастания цены, сравнивая у курсов первые элементы массива цен курсов (course.prices[0])