Может ли это быть реорганизовано на использование общих функциональных принципов?

Функция компаратора ascending принимает два аргумента - a и b. Он должен возвращать целое число, сравнивающее два.

У меня есть список, который я хочу сортировать по имени, поэтому я написал следующие функции.

Есть ли функциональная идиома, которую я могу использовать для объединения этих двух функций, вместо того, чтобы byName взять на себя ответственность за составление результирующей функции?

const ascending = (a, b) => a.localeCompare(b);
const byName = (i) => i.get('name');
const useTogether = (...fns) => ...; // is there an idiomatic function like this?

// usage
items.sort(useTogether(byName(ascending))); 

Ответ 1

Я не уверен, удовлетворяет ли оно то, что вы ищете, но вот одна возможная формулировка вашего useTogether (с несколько иной подписью), которая делает WORK. Я не знаю стандартной функции с таким эффектом.

const ascending = (a, b) => a.localeCompare(b);
const byName = (i) => i['name'];
const useTogether = (selector, consumer) => (...fnArgs) => consumer(...fnArgs.map(selector));

var items = [{ name: "C" }, { name: "A" }, { name: "B" }];

console.log(
  items.sort(useTogether(byName, ascending))
)

Ответ 2

Вы ищете контравариантные функторы

Чтобы оценить их должным образом, начните с изучения самой основной программы сортировки

const compare = (a, b) =>
  a.localeCompare (b)

const data =
  [ 'Cindy'
  , 'Alice'
  , 'Darius'
  , 'Bertrand'
  ]
  
data.sort (compare)

console.log (data)
// Alice, Bertrand, Cindy, Darius