Может ли это быть реорганизовано на использование общих функциональных принципов?
Функция компаратора 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