为什么这个基本 "R.useWith" 不能正常工作?
Why isn't this basic "R.useWith" working properly?
我对 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
需要一个函数,并将每个 object
从 myArray
映射到该函数。所以,正如预期的那样,这有效:
mapMyArray( setFooToBar )
现在,我不明白的是为什么这种方法没有按照我期望的方式工作:
let callFirstWithSecond = ( arg1, arg2 ) => arg1( arg2 );
R.useWith(
callFirstWithSecond,
[
R.map( R.__ ),
R.assoc('foo')
]
)( myArray, 'bar' )
我希望这 return 与以前的方法相同,一个新的对象数组,每个对象都有一个新的 属性 of foo
设置为 bar
.然而,它实际上是 returning 一个新功能。我不知道我在哪里缺少参数。
在此先感谢您的帮助!
你对useWith
的理解没有错。
问题是占位符的使用,R.__
in
R.map( R.__ )
使用占位符作为最后一个参数没有意义。它用作 "the argument that goes here will be supplied later." 的信号,因为 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.__ )
替换为 R.flip( R.map )
来获得您想要的行为。
您可以在 Ramda REPL.
中看到实际效果
我对 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
需要一个函数,并将每个 object
从 myArray
映射到该函数。所以,正如预期的那样,这有效:
mapMyArray( setFooToBar )
现在,我不明白的是为什么这种方法没有按照我期望的方式工作:
let callFirstWithSecond = ( arg1, arg2 ) => arg1( arg2 );
R.useWith(
callFirstWithSecond,
[
R.map( R.__ ),
R.assoc('foo')
]
)( myArray, 'bar' )
我希望这 return 与以前的方法相同,一个新的对象数组,每个对象都有一个新的 属性 of foo
设置为 bar
.然而,它实际上是 returning 一个新功能。我不知道我在哪里缺少参数。
在此先感谢您的帮助!
你对useWith
的理解没有错。
问题是占位符的使用,R.__
in
R.map( R.__ )
使用占位符作为最后一个参数没有意义。它用作 "the argument that goes here will be supplied later." 的信号,因为 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.__ )
替换为 R.flip( R.map )
来获得您想要的行为。
您可以在 Ramda REPL.
中看到实际效果