我决定用Ramda编写一个简单的todo应用程序,但是我一直被一个重构相关的问题困住了。以下是我认为可以重构的两个函数:
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有什么(实用的)想法吗?
发布于 2016-10-04 16:07:59
有几种方法可以解决这个问题。
也许最直接的是
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中看到所有这些操作。
https://stackoverflow.com/questions/39853581
复制相似问题