首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ramda.js重构

Ramda.js重构
EN

Stack Overflow用户
提问于 2016-10-04 13:25:10
回答 1查看 185关注 0票数 3

我决定用Ramda编写一个简单的todo应用程序,但是我一直被一个重构相关的问题困住了。以下是我认为可以重构的两个函数:

代码语言:javascript
复制
const isItemCompleted = R.pipe(
    R.prop("states"),
    R.contains("completed")
)

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

正如您所看到的,有一些代码重复,如果我有更多的状态,这会变得更加混乱。我一直试图将重复的功能隔离开来:

代码语言:javascript
复制
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函数的数据可能如下所示:

代码语言:javascript
复制
let item = {states:["editing", "complete"]};
isItemCompleted(item); //true

有什么(实用的)想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-04 16:07:59

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

也许最直接的是

代码语言:javascript
复制
const statesContains = R.curry(
  (state, item) => R.contains(state, R.prop('states', item))
);

const isItemCompleted = statesContains("completed");

但是,想要抽象一下这一点是合理的,允许搜索属性也会有变化。这样你就可以写:

代码语言:javascript
复制
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。有了这个,您可以简单地写:

代码语言:javascript
复制
const isItemCompleted = R.where({states: R.contains('completed')});

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39853581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档