Javascript Ramda帮助:无点实现,带有指向直接参数的占位符
这是我第一次和拉姆达交往。我正在尝试创建一个映射函数,它会自动为数组中的每个对象添加一个键。这将有助于反应无状态函数,例如,我们可能有一个带有签名的函数Javascript Ramda帮助:无点实现,带有指向直接参数的占位符,javascript,functional-programming,currying,ramda.js,Javascript,Functional Programming,Currying,Ramda.js,这是我第一次和拉姆达交往。我正在尝试创建一个映射函数,它会自动为数组中的每个对象添加一个键。这将有助于反应无状态函数,例如,我们可能有一个带有签名的函数 ({ prop1, prop2, key }) => ... 和一系列 [{ prop1: 'prop one', prop2: 'prop two' }, {...etc}] 下面是一个工作示例: const mapI = R.addIndex(R.map); const mapAddIndexedProp = R.curry(
({ 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>));
const-mapAddIndexedProp=mapI(R.pipe(R.flip(R.assoc()),);
但我不知道这是怎么回事。任何想法都将不胜感激
或者,很有可能,有一种更干净的方法可以做到这一点,比如“过度”或转换。谢谢 如果你不坚持免费积分,我认为这是非常简单的:
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'}
// ];
我相信有一种方法可以让这一点免费。但我也很确定,它的外观会明显不那么优雅。您是否希望将诸如
[{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中所述,但其思想是将向对象添加一个键抽象为映射变换的一部分,并放在将在此新映射函数上调用的函数之前。仍然不太清楚,但本质上这将允许调用newMapWithKey(someFn,[{…},{…}])。在我给出的示例中,调用mapAddKeyProp(someFn,[{…},{…}])将在传递到someFn之前向每个对象添加[{key:0…},{key:1…}],这可能需要使用该key.yep,这就实现了这一点,而cleaner没有管道和翻转,这有助于它更接近无点,同时肯定会牺牲可读性。“免费积分”也是我想到的一个词。谢谢,这实际上是我第一次听到它,我正试图用这个函数实现它。我希望Ramda可以有一种方法来说明如何应用参数(R.uuuu和R.nthArg的某种组合或其他东西…),以实现这里的无点理想,但在这种情况下,它可能不值得。谢谢如果你还有时间的话,我想让这个问题变得毫无意义与你在这里给出的答案有些相似。那里的代码现在执行时出现错误“arity的第一个参数必须是不大于10的非负整数”。你有没有可能帮助我理解这个代码/错误,或者进一步推动我在这里对无点实现的愚蠢探索?下面是我指的代码://take::Number->Object->Object var take=R.converge(R.pick,R.useWith(R.take,R.identity,R.keys),R.nthArg(1));我更新了答案,注意到toconverge
和useWith
意味着稍微修改函数。