【发布时间】:2016-01-16 11:56:07
【问题描述】:
这是我第一次使用 ramda。我正在尝试创建一个映射函数,该函数会自动为数组中的每个对象添加一个键。将有助于反应无状态函数,例如,我们可能有一个带有签名的函数
({ prop1, prop2, key }) => ...
还有一个数组
[{ prop1: 'prop one', prop2: 'prop two' }, {...etc}]
这是一个工作示例:
const mapI = R.addIndex(R.map);
const mapAddIndexedProp = R.curry((key, fn) => mapI(R.pipe(R.flip(R.assoc(key)), fn)));
const mapAddKeyProp = mapAddIndexedProp('key');
但是,鉴于我真正想要的是一个接受字符串和函数的函数,似乎应该有一种方法可以执行以下操作:
const mapAddIndexedProp = mapI(R.pipe(R.flip(R.assoc(<arg1>)), <arg2>));
但我不知道它是如何工作的。任何想法将不胜感激。
或者,很有可能,有一种更简洁的方法可以做到这一点,比如“over”或 transduce。谢谢!
【问题讨论】:
-
您希望将
[{first: 'Alice', last: 'Jones'}, {first: 'Bob', last: 'Smith'}]之类的列表转换为[{first: 'Alice', last: 'Jones', fullName: 'Alice Jones'}, {first: 'Bob', last: 'Smith', fullName: 'Bob Smith'}]之类的列表吗? -
这可能是最终函数的最终目标,正如@Scott Sauyet 在下面的 addFullNames 中所描述的那样,但其想法是将向对象添加键作为映射变换的一部分和前面将在这个新的 map 函数上调用的函数。仍然不是很清楚,但本质上这将使调用 newMapWithKey(someFn, [{...},{...}]) 成为可能。在我给出的示例中,调用 mapAddKeyProp(someFn, [{...}, {...}]) 会将 [{ key: 0 ...}, { key: 1 ...}] 添加到之前的每个对象传递给 someFn,它可能需要使用该键。
标签: javascript functional-programming currying ramda.js