使用 Ramda 对键和值应用不同的函数

Apply different function to key and value of a pair using Ramda

tl;dr:我正在寻找 Ramda 的 (http://ramdajs.com) equivalent of Mori's knit 函数。

我想对 key/value 对中的键和值应用不同的函数。这个(人为的)示例使用 mori.knit(f0, f1, ...) 在键上应用 toUpper 函数,在 key/value 对的值上应用 toLower 函数:

const pairs = [ [ "key1", "VAL1" ], [ "key2", "VAL2" ], ... ]);
const result = mori.knit(toUpper, toLower, pairs);
// => [ [ "KEY1", "val1" ], [ "KEY2", "val2" ], ... ]

我正在寻找使用 Ramda 将不同函数应用于 key/value 对的键和值的等效项。

Ramda 没有这个功能。建立一些接近的东西并不难。这是一个类似的版本,稍作改动 API 并且更通用:

const knit = compose(map, zipWith(call));

const pairs = [["key1", "VAL1"], ["key2", "VAL2"], ["key3", "VAL3"]];
knit([toUpper, toLower])(pairs);
//=> [["KEY1", "val1"], ["KEY2", "val2"], ["KEY3", "val3"]]

const triples = [["key1", "VAL1", 1], ["key2", "VAL2", 2], ["key3", "VAL3", 3]];
const square = n => n * n;
knit([toUpper, toLower, square])(triples);
//=> [["KEY1", "val1", 1], ["KEY2", "val2", 4], ["KEY3", "val3", 9]]

如果你真的想在初始调用中传递列表,你可以这样写:

const knit = useWith(map, [zipWith(call), identity]);

如果该版本看起来不必要地晦涩难懂,您始终可以使用不是 points-free 的版本,例如:

const knit = (fns, xs) => map(zipWith(call, fns), xs);

但是其中 none 有一个免费的函数列表;他们被包裹在一个列表中。这是 Ramda 函数的规范。如果你真的想要更多像 mori 功能,你可以添加一个 unapply:

const knit = compose(map, unapply(zipWith(call)));
knit(toUpper, toLower)(pairs);
knit(toUpper, toLower, square)(triples);

我个人的偏好是最简单的:

const knit = compose(map, zipWith(call));
knit([toUpper, toLower])(pairs);
knit([toUpper, toLower, square])(triples);

您可以在 Ramda REPL.

上使用其中一些变体