tl; dr :我正在寻找Ramda(http://ramdajs.com)相当于Mori的knit函数。
我想对键/值对中的键和值应用不同的函数。这个(人为的)示例使用mori.knit(f0, f1, ...)
在键上应用toUpper
函数,在键/值对的值上应用toLower
函数:
const pairs = [ [ "key1", "VAL1" ], [ "key2", "VAL2" ], ... ]);
const result = mori.knit(toUpper, toLower, pairs);
// => [ [ "KEY1", "val1" ], [ "KEY2", "val2" ], ... ]
我正在寻找使用Ramda将等效函数应用于键/值对的键和值的等价物。
答案 0 :(得分:1)
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 上使用其中一些变体。