Ramda.js 重构
Ramda.js refactoring
我决定使用 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
中看到所有这些操作
我决定使用 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
中看到所有这些操作