gpt4 book ai didi

javascript - Ramda.js 重构

转载 作者:行者123 更新时间:2023-11-29 19:09:52 25 4
gpt4 key购买 nike

我决定使用 Ramda 编写一个简单的待办事项应用程序,但我一直被一个与重构相关的问题所困扰。以下是我认为可以重构的两个函数:

const isItemCompleted = R.pipe(
R.prop("states"),
R.contains("completed")
)

const isItemEdited = R.pipe(
R.prop("states"),
R.contains("editing")
);

如您所见,有一些代码重复,如果我有更多状态,这会变得更加困惑。我一直在尝试隔离重复的功能:

const statesContains = R.flip(R.pipe(
R.prop('states'),
R.contains()
))

//I would like to use it like this:
const isItemCompleted = statesContains("completed")
const isItemEdited = statesContains("editing")

但我就是无法解决这个问题。我可以让它使用不同的参数顺序,但我想遵循数据最后的规则来创建简洁的函数。

传递给这些 isItemCompleted 和 isItemEdited 函数的数据可能是这样的:

let item = {states:["editing", "complete"]};
isItemCompleted(item); //true

有什么(功能性的)想法吗?

最佳答案

有几种方法可以解决这个问题。

也许最直接的是

const statesContains = R.curry(
(state, item) => R.contains(state, R.prop('states', item))
);

const isItemCompleted = statesContains("completed");

但是想要将其抽象一点是合理的,以允许搜索的属性也发生变化。所以你可以这样写:

const propContains = R.curry(
(propName, state, item) => R.contains(state, R.prop(propName, item))
);

const editorsContains = propContains('editors')
const edFred = editorsContains('fred');

// or edFred = propContains('editors', 'fred');

这两个都是有道理的。但是 Ramda 有一个功能读起来非常好,可以很好地满足这些需求,where .有了这个,你可以简单地写:

const isItemCompleted = R.where({states: R.contains('completed')});

我相信,如果您正在寻找一次性产品,这是最简单的方法。但以上两者都可以帮助您创建可重用的函数。

您可以在 Ramda REPL 中看到所有这些操作。

关于javascript - Ramda.js 重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39853581/

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