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

标签 javascript functional-programming ramda.js mori

tl;dr:我正在寻找与 Mori 的 http://ramdajs.com 等效的 Ramda ( knit )功能。

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

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 函数这样的函数,你可以添加一个 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 上使用其中一些变体。

关于javascript - 使用 Ramda 对键和值对应用不同的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41627734/

相关文章:

javascript - 在使用 jQuery Ajax 加载的页面中运行 javascript

javascript - 如何加密 pouchdb 数据库

javascript - 如何确保两个客户端不会同时请求破坏状态

haskell - 函数式语言中的部分求值和函数内联有什么区别?

python - 我们怎么称呼这个(新的?)高阶函数?

out-of-memory - 基于不可变数据结构的应用程序不会耗尽内存吗?

functional-programming - ImmutableJS vs Ramda 或 ImmutableJS + Ramda - 它们可以一起使用吗

javascript - 使用 Jquery 循环 Json

javascript - 将数组对象展平为单个对象 - Javascript