如何在没有专门调用返回函数的情况下使用ramda来调整多个参数

时间:2016-11-22 08:53:36

标签: javascript functional-programming ramda.js

是否可以创建具有多个参数的af函数,这些参数返回一个compose并使用最后一个参数自动调用它。见下面的例子

const data = {
  hello: 'world'
}

const propContains = (values, key) => compose(contains(__,values),prop(key))
propContains(['wor','ld'], 'hello')(data) // --> false
propContains(['wor','ld'], 'hello', data) // --> Function

// this is working but don't want to invoke the compose with the last argument
const propContains2 = (values, key, obj) => compose(contains(__,values),prop(key))(obj)
propContains2(['wor','ld'], 'hello', data) // --> false  

以下是Ramda REPL

1 个答案:

答案 0 :(得分:1)

您还不清楚自己要做什么。这是一个只查找单个值的版本:

let propContains = curry((value, key, obj) => 
    contains(value, prop(key, obj)));
propContains('wor', 'hello', data); //=> true
propContains('ld', 'hello', data); //=> true
propContains('foo', 'hello', data); //=> false

这是一个检查多个值的人,基本上是map ping上述内容:

let propContains = curry((value, key, obj) => 
    map(contains(__, prop(key, obj)), value));
propContains(['wor', 'ld', 'foo'], 'hello', data); //=> [true, true, false]

如果您想查看它们是否全部包含在内,您可以

let propContainsAll = curry((value, key, obj) => 
    all(contains(__, prop(key, obj)), value));
propContainsAll(['wor', 'ld'], 'hello', data); //=> true
propContainsAll(['wor', 'ld', 'foo'], 'hello', data); //=> false

你可以为any做类似的事情。

由于所有这些都与Ramda的curry相结合,您可以选择是在第一次调用时提供最终参数来获取数据还是跳过它并返回一个函数。但是,我不清楚这是否是你正在寻找的东西。

更新

我对这个名字感到很困惑。 " propContains",这对我来说意味着财产的价值包含了一些东西。现在我看到你真的想要一些我可以写的东西" propContainedIn"或者其他一些:

// propContainedIn :: [a] -> String -> Object{String: a} -> Bool
const propContainedIn = curry((values, key, obj) => 
    contains(prop(key, obj), values));
propContainedIn(['wor', 'ld'], 'hello')(data) //=> false
propContainedIn(['wor', 'ld'], 'hello', data) //=> false
propContainedIn(['wor', 'ld', 'world'], 'hello', data) //=> true
propContainedIn(['wor', 'ld', 'world'], 'hello')(data) //=> true

虽然我确信只要有足够的工作就可以免费获得,但它的可读性肯定要低于此,所以我不明白这一点。

你也可以在(更新的) Ramda REPL 上看到这一点。