Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ramda帮助:无点实现,带有指向直接参数的占位符_Javascript_Functional Programming_Currying_Ramda.js - Fatal编程技术网

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));我更新了答案,注意到to
converge
useWith
意味着稍微修改函数。