gpt4 book ai didi

javascript - 基于先前参数设置属性的 Ramda.js 管道

转载 作者:行者123 更新时间:2023-12-01 16:18:19 24 4
gpt4 key购买 nike

目前,我有以下代码(有效):

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com