2

这是我第一次使用 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”之类的方法来执行此操作。谢谢!

4

1 回答 1

2

我认为如果您不尝试坚持使其免积分,这很简单:

const addKey = R.curry((key, fn, vals) => 
    R.map(obj => 
        R.assoc(key, fn(obj), obj), vals));

如果您确实也需要索引,则可以将其扩展为:

const addKey2 = R.curry((key, fn, vals) => 
    R.addIndex(R.map)((obj, idx) => 
        R.assoc(key, fn(obj, idx), obj), vals));

你可以使用是这样的:

const addFullNames = addKey('fullName', person => 
    `${person.first} ${person.last}`
);

const initials = person => R.head(person.first) + R.head(person.last);
const  addIds = addKey2('id', (person, idx) => `${initials(person)}_${idx}`)

var people = [
    {first: 'Wilma', last: 'Flintstone'}, 
    {first: 'Betty', last: 'Rubble'}
];

addFullNames(people); //=>
// [
//     {first: 'Wilma', last: 'Flintstone', fullName: 'Wilma Flintstone'}, 
//     {first: 'Betty', last: 'Rubble', fullName: 'Betty Rubble'}
// ];

addIds(people); //=>
// [
//     {first: 'Wilma', last: 'Flintstone', id: 'WF_0'}, 
//     {first: 'Betty', last: 'Rubble', id: 'BR_1'}
// ];

我确信有一种方法可以使这一点免费。但我也很确定它的外观会明显不那么优雅。

于 2015-10-18T02:25:13.747 回答