[英]Ramda.js refactoring
我决定使用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
有(实用的)想法吗?
有几种方法可以解决这个问题。
也许最直接的是
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中看到所有这些操作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.