Javascript 使用Ramda对密钥和值应用不同的函数

Javascript 使用Ramda对密钥和值应用不同的函数,javascript,functional-programming,ramda.js,mori,Javascript,Functional Programming,Ramda.js,Mori,tl;dr:我正在寻找Ramda()函数与Mori函数的等价物 我想对键/值对中的键和值应用不同的函数。此(人为)示例使用mori.knit(f0,f1,…)对键应用toUpper函数,对键/值对应用toLower函数: const pairs = [ [ "key1", "VAL1" ], [ "key2", "VAL2" ], ... ]); const result = mori.knit(toUpper, toLower, pairs); // => [ [ "KEY1", "va

tl;dr:我正在寻找Ramda()函数与Mori函数的等价物

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

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

我正在寻找使用Ramda对键/值对的键和值应用不同函数的等效方法。

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]);
如果该版本看起来不必要的神秘,您可以始终使用非免费的版本,例如:

const knit = (fns, xs) => map(zipWith(call, fns), xs);
但这些都没有一个免费的函数列表;它们被包装在一个列表中。这是Ramda函数的标准。如果您真的想要一个类似mori函数的函数,您可以不加选择地添加一个

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);

您可以在

上玩其中的一些变体。非常感谢您提供的详细答案,这正是我想要的!干杯