- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我有以下代码(有效):
const double = R.multiply(2);
const piped = R.pipe(
(obj) => R.assoc('b', double(obj.a))(obj),
(obj) => R.assoc('c', double(obj.b))(obj)
);
console.log(
piped({ a: 1 })
);
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
但是我认为由于每个管道函数末尾的 (obj)
,我想我可以将它重构为“Ramda 世界”中更好的东西。
我对这个库还是个新手,所以我还不知道所有的方法和技巧。
使用 Ramda 有更好的方法吗?
我的“真实”代码是这样的:
function getScripts() {
const tryRequire = tryCatch((path) => require(path).run, always(null));
const addPathAndRunProps = pipe(
// Note: The `scriptsPath` function is a bound path.join function.
// It just returns a string.
(dir) => assoc('path', scriptsPath(dir.name, 'index.js'))(dir),
(dir) => assoc('run', tryRequire(dir.path))(dir)
);
const addModuleRunAndFilterInvalid = pipe(
map(addPathAndRunProps),
filter((dir) => typeof dir.run === 'function')
);
return addModuleRunAndFilterInvalid(
fs.readdirSync(SCRIPTS_PATH, { withFileTypes: true })
);
}
最佳答案
我认为您可能在这里过度使用了 Ramda。代码有点困惑。这在将来可能更容易阅读并且更易于维护,同时仍然可以正常工作:
function getScripts() {
const tryRequire = tryCatch((path) => require(path).run, always(null));
const addPathAndRunProps = dir => {
const path = scriptsPath(dir.name, 'index.js')
return {
...dir,
path,
run: tryRequire(path),
}
}
return pipe(
map(addPathAndRunProps),
filter(x => typeof x.run === 'function'),
)(fs.readdirSync(SCRIPTS_PATH, { withFileTypes: true }))
}
或者,如果您真的想保留这些 setter ,请尝试将您的 addPathAndRunProps
函数拆分为两个 setter :
function getScripts() {
const tryRequire = tryCatch((path) => require(path).run, always(null));
const addPathProp = x => assoc('path', scriptsPath(x.name, 'index.js'), x)
const addRunProp = x => assoc('run', tryRequire(x.path), x)
return pipe(
map(addPathProp),
map(addRunProp),
filter(x => typeof x.run === 'function'),
)(fs.readdirSync(SCRIPTS_PATH, { withFileTypes: true }))
}
在这两种情况下,我都删除了您的 addModuleRunAndFilterInvalid
函数。将 addModuleRunAndFilterInvalid
拆分到它自己的函数中并没有使您的函数更加清晰,返回管道的结果阐明了 getScripts
函数本身的目的。
此外,在您的代码中,您不断调用在 dir
上操作的对象。这是令人困惑的,因为它暗示对象在每次函数调用时都具有相同的结构。但是,传递给 addRunProp
的变量与传递给 addPathProp
的结构不同(传递给 addRunProp
的变量需要额外的 路径
属性)。要么想出一个描述性名称,要么只使用 x
。您可以将 x
视为您的函数正在运行的对象。要弄清楚 x
是什么,请查看函数名称(例如 addRunProp
表示 x
将添加一个运行属性).
另一个可能有用的提示:我已经确定了 aug
(“augment”的缩写)的命名约定,用于向对象添加属性或信息位。因此,我将重命名您的 addPathProp
函数 augPath
并将您的 addRunProp
函数重命名为 augRun
。因为我一直使用它,所以我知道当我在函数开头看到 aug
时,它正在添加一个属性。
关于javascript - 基于先前参数设置属性的 Ramda.js 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59761628/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!