我对 Ramda 还很陌生,并且仍在尝试了解某些功能。目前,我在 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' )
我希望这会返回与之前的方法相同的内容,一个新的对象数组,每个对象都有一个设置为 bar
的新属性 foo
。然而,它实际上返回一个新函数。我不知道我在哪里缺少争论。
预先感谢您的帮助!
最佳答案
您对useWith
的理解没有任何问题。
问题是在
中使用了占位符R.__
R.map( R.__ )
使用占位符作为最后一个参数没有意义。它被用作“此处的参数将在稍后提供”的信号。由于 Ramda 函数已经被柯里化(Currying),因此在没有任何后续内容的情况下使用它是无操作的。
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.__ )
替换为 R.flip( R.map )
来获得所需的行为。
您可以在 Ramda REPL 中看到此操作的实际效果。 。
关于javascript - 为什么这个基本的 "R.useWith"不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39882566/