Javascript 为什么不是';“这是最基本的”;R.useWith";工作正常吗?
我对Ramda还相当陌生,仍在努力思考某些函数。目前,我在Javascript 为什么不是';“这是最基本的”;R.useWith";工作正常吗?,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我对Ramda还相当陌生,仍在努力思考某些函数。目前,我在R.useWith方面有些困难 假设我有一个对象数组: let myArray = [ { a: 'wat', b: 'foo' }, { a: 'something', b: 'something_else' }, { a: 'booyah', b: 'duh' } ]; 我想在每个对象上设置foo的属性,使其等于bar。我知道有几种方法可以做到这一点,我只是
R.useWith
方面有些困难
假设我有一个对象数组:
let myArray = [
{
a: 'wat',
b: 'foo'
},
{
a: 'something',
b: 'something_else'
},
{
a: 'booyah',
b: 'duh'
}
];
我想在每个对象上设置foo
的属性,使其等于bar
。我知道有几种方法可以做到这一点,我只是在尝试学习这个函数时将其作为一个人为的例子。一种方法是:
let setFooToBar = R.assoc('foo')('bar');
let mapMyArray = R.map( R.__, myArray );
因此,在这一点上,我有一个函数setFooToBar
,它需要一个对象,并将属性foo
设置为bar
,还有一个函数mapMyArray
需要一个函数,并将myArray
中的每个对象映射到该函数。因此,正如预期的那样,这是可行的:
mapMyArray(setFooToBar)
现在,我不明白的是,为什么这种方法没有按照我预期的方式工作:
let callFirstWithSecond = ( arg1, arg2 ) => arg1( arg2 );
R.useWith(
callFirstWithSecond,
[
R.map( R.__ ),
R.assoc('foo')
]
)( myArray, 'bar' )
我希望这将返回与前一种方法相同的东西,一个新的对象数组,每个对象的新属性foo
设置为bar
。然而,它实际上返回了一个新函数。我不知道我在哪里遗漏了论点
提前感谢您的帮助 您对useWith
的理解没有错
问题是在中使用占位符R.\uu
R.map( R.__ )
使用占位符作为最后一个参数没有意义。它被用作“此处的参数将在以后提供”的信号。由于Ramda函数已经被使用,因此在没有任何后续内容的情况下使用它是不可操作的
let someFunc = (p1, p2, p3, p4) => 'whatever';
someFunc(argA, __, __, argD) ~>
(p2, p3) => someFunc(argA, p2, p3, argD)
// but
someFunc(argA, argB, __, __) ~>
(p3, p4) => someFunc(argA, argB, p3, p4) ~==
someFunc(argA, argB)
您可以通过将R.map(R..\uu)
替换为R.flip(R.map)
来获得所需的行为
你可以在中看到这一点,啊,非常感谢,斯科特!这完全有道理。。。这是一个多么愚蠢的错误。这表明你的直觉是正确的