gpt4 book ai didi

javascript - 为什么这个基本的 "R.useWith"不能正常工作?

转载 作者:行者123 更新时间:2023-11-29 21:14:47 25 4
gpt4 key购买 nike

我对 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 需要一个函数,并将每个 objectmyArray 映射到该函数。所以,正如预期的那样,这是可行的:

mapMyArray( setFooToBar )

现在,我不明白的是为什么这种方法没有按照我期望的方式工作:

let callFirstWithSecond = ( arg1, arg2 ) => arg1( arg2 );

R.useWith(
callFirstWithSecond,
[
R.map( R.__ ),
R.assoc('foo')
]
)( myArray, 'bar' )

我希望这会返回与之前的方法相同的东西,一个新的对象数组,每个对象都有一个新属性 foo 设置为 bar。但是,它实际上返回了一个新函数。我不知道我在哪里缺少参数。

在此先感谢您的帮助!

最佳答案

你对useWith的理解没有错。

问题是占位符的使用,R.__ in

 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com