Cat*_*ima 0 javascript functional-programming ramda.js
我是Ramda和函数式编程的新手,我想知道有人将如何改进下面的代码或将其转换为自由点样式
const doc = {
passwordRecovery: {
requested: true,
expiresAt: new Date(Date.now() + 1000).toISOString(),
code: 'abc'
}
}
const req = {
password: '123',
passwordRecovery: {
code: 'abc'
}
}
const pathCode = R.path(['passwordRecovery', 'code'])
const isValidCode = R.curry(
(doc, req) => R.all(
R.hasPath(['passwordRecovery', 'code'], req),
R.pathEq(['passwordRecovery', 'requested'], true, doc),
R.compose(R.complement(R.isNil), pathCode)(doc),
R.equals(pathCode(req), pathCode(doc)),
R.pipe(
R.path(['passwordRecovery', 'expiresAt']),
Date.parse,
R.gte(R.__, Date.now()),
)(doc)
)
);
isValidCode(doc)(req)
Run Code Online (Sandbox Code Playgroud)
几个建议:
不熟悉Curry的人经常说同样的话:为什么add(1)(2)在您可以做的时候add(1, 2)呢?他们是对的。这个例子根本不公平。
如果您的团队只是想熟悉函数式编程,请不要不必要地使他们感到困惑。如果您可以一次性提供所有参数,请执行以下操作:
isValidCode(doc, req); // not isValidCode(doc)(req);
Run Code Online (Sandbox Code Playgroud)
这与:R.equals(pathCode(req), pathCode(doc))相同pathCode(req) === pathCode(doc)。
如果您确实想使用Ramda,请考虑eqBy:
eqBy(pathCode, req, code);
Run Code Online (Sandbox Code Playgroud)
当然,这是一种有趣的编写函数的方式,但这并不是目标。假设您需要检查a等于'foo'和b等于'bar':
这是没有意义的功能:
const fn = useWith(and, [equals('foo'), equals('bar')]);
Run Code Online (Sandbox Code Playgroud)
有什么比这更好的了:
const fn = (a, b) => a === 'foo' && b === 'bar';
Run Code Online (Sandbox Code Playgroud)
?
all正确调用?根据文档,all获取一个函数和一个列表:
all(x => x === 42)([41, 42, 43]);
Run Code Online (Sandbox Code Playgroud)
除非我弄错了,否则您所做的就是all使用每个函数调用的结果进行调用。例如
all(true, false, true, ...);
Run Code Online (Sandbox Code Playgroud)
__占位符gte(__, Date.now()) 可以更改为 flip(gte)(Date.now())
在一种情况下,您可以将路径设置为undefined:
// true even for `{passwordRecovery: {code: undefined}}`
hasPath(['passwordRecovery', 'code'], req);
Run Code Online (Sandbox Code Playgroud)
而在另一种情况下,您不会:
compose(R.complement(R.isNil), pathCode)(doc)
Run Code Online (Sandbox Code Playgroud)
保持一致将允许:
const notNil = complement(isNil);
both(pathSatisfies(notNil, pathCode), req, doc)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |