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

标签 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 。我知道有多种方法可以做到这一点,我只是在尝试学习此功能时将其用作人为的示例。一种方法是这样做:

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/

相关文章:

javascript - 如何使用 javascript 显示特定下拉选项的消息?

javascript - 无限函数调用

javascript - Bootstrap 3 Tabs 和 HTML5 表单验证

javascript - Ramda 循环数组

javascript - 更改 ramda.js 中对象列表中的 prop

javascript - 如何从 element.style 中删除多个 css 样式

javascript - 如何将嵌套对象数组转换为javascript中的对象?

haskell - 递归到 Haskell 中尚不存在的函数

functional-programming - 函数列表

functional-programming - curry 函数中的反向参数顺序(ramda js)