我正在实现一个函数,该函数执行以下详细摘要搜索,此示例实现适用于此功能:
// 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}
我正在尝试使用useWith
(https://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编写,但仍然可供其他程序员合理使用。)
答案 0 :(得分:1)
您做对了。唯一的问题是您使用的REPL版本:
是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+中正常运行。