如何使用Ramda的useWith

时间:2018-08-10 00:28:09

标签: javascript ramda.js

我正在实现一个函数,该函数执行以下详细摘要搜索,此示例实现适用于此功能:

// findRecord :: id → [{id: number}] → {id: number}|null
const findRecord = R.curry((id, list) => R.find(R.propEq('id', id), list));
findRecord(1, [{id: 1}]); // {id: 1}

我正在尝试使用useWithhttps://ramdajs.com/docs/#useWith)实现该方法:

// findRecord :: id → [{id: number}] → {id: number}|null
const findRecord = R.useWith(R.find, [R.propEq('id'), R.identity]);
findRecord(1, [{id: 1}]); // Error('r[u] is not a function')

我要去哪里错了?我是不是误解了useWith的签名/用法,如果可以,那么另一个Ramda函数在这里对我会更好吗? (“更好”的含义同样简洁,即使是用ES5编写,但仍然可供其他程序员合理使用。)

REPL

1 个答案:

答案 0 :(得分:1)

您做对了。唯一的问题是您使用的REPL版本:

  

https://ramdajs.com/repl/?v=0.17.1#?const%20data ...

是0.17.1,而您正在阅读的文档是最新版本0.25.0。

如果您查看源代码,就会发现问题所在,在0.17.1中,useWith开头为:

module.exports = curry(function useWith(fn /*, transformers */) {
  var transformers = _slice(arguments, 1);
  var tlen = transformers.length;
  // ...

也就是说,transformer函数应该是初始fn之后的纯自变量,例如R.useWith(R.find, R.propEq('id'), R.identity);。如果您这样使用useWith,则在您的0.17.1 REPL版本中,它将按预期工作:

const findProject1 = R.useWith(R.find, R.propEq('id'), R.identity);
findProject1(1, [{id:1}, {id: 2}]);

输出:

{"id": 1}

但是在0.18.0及更高版本中,transformers应该作为数组在第二个参数中传递,而不是作为参数列表传递。参见the source

module.exports = _curry2(function useWith(fn, transformers) {
  return curry(_arity(transformers.length, function() {
  // ...

该更改似乎来自this issue等。

因此,要么升级到Ramda的最新版本,要么通过将函数作为单独的参数而不是数组传入来使用useWith。您的代码可以在0.18.0+中正常运行。