6

我正在尝试在我的 javascript 应用程序中更多地转向函数式编程。我目前使用库 ramda 作为基础库。

我的愿望:

  1. 创建一个函数 removeUserFromList(username, list),它返回列表中与用户名不匹配的项目。
  2. 使实现尽可能短,尽可能依赖 Ramda 库中现有的函数。

条件:

包含嵌套用户对象的列表:

[{
    providers: {
        github: {
            login: "username1"
        }
    }

},
{
    providers: {
        github: {
            login: "username2"
        }
    }

}]    

迄今为止取得的成绩:

var list = [{providers: {github: {login: "username1"}}},
            {providers: {github: {login: "username2"}}}];

var getLoginName = R.useWith(R.path('providers.github.login'));
var isLoginNameEq = R.useWith(R.eq, getLoginName);

isLoginNameEq(list[0], "username1") // => true

//From this point on I am totally clueless, 
//but I believe I should combine these functions 
//with R.reject in some way.

Plunkr 演示:

http://plnkr.co/edit/1b5FjxV3Tcgz7kozW1jX

问题:

有没有更适合的函数来实现类似于 R.eq 但在嵌套对象(可能是 R.pathEq)上的东西?

4

3 回答 3

6

我刚收到一个合并请求R.pathEq在 ramda.js 的下一个版本(当前版本是 0.6.0)之前它不能使用,但同时你可以像这样重新创建它:

var pathEq = R.curry(function(path, val, obj) {
    return R.eq(val, R.path(path, obj));
}); 

然后像这样使用它:

 var rejectThis = 'userName1';
 var myFilter = R.useWith(R.reject, pathEq('providers.github.login'):
 var filteredList = myFilter(rejectThis, users);
于 2014-10-08T18:23:35.170 回答
1

如果您不需要创建无点功能,您可以简单地:

var removeUserFromList= function(name, list) {
    return R.reject(pathEq('providers.github.login', name), list);
}
console.log(removeUserFromList('username1', users));

使用@Ludwig Magnussen 的pathEq功能。

于 2014-10-13T12:32:25.070 回答
1

从@LudwigMagnusson 扩展解决方案,您可以这样做:

// terrible name, but I'm never good at that.
var rejectPathVal = R.curry(function(path, val, list) {
    return R.reject(R.pathEq(path, val), list);
});

var filteredList = rejectPathVal('providers.github.login', 'userName1', list);

当然,您可以像这样使用它:

var myFilter = rejectPathVal('providers.github.login', 'userName1');
// ...
var filteredList = myFilter(list);

或以您选择的任何方式,因为它是完全咖喱的。尽管正如 Ludwig 所指出的,pathEq它不在 Ramda 的发布版本中,但您可以通过从 Github 下载 HEAD 版本来获取它,或者您可以使用上面提供的 Ludwig 版本。


但我想对你的要求提出一些质疑。我赞赏你尝试转向更实用的风格。我是 Ramda 的作者之一,我认为这是一个图书馆的绝佳选择,但这似乎是不必要的:

使实现尽可能短,尽可能依赖 Ramda 库中现有的函数。

我建议可读性的目标应该总是胜过简洁的目标。诚然,优雅和可读性通常与简洁联系在一起,但“尽可能短”绝不应该成为驱动目标。

于 2014-10-12T00:10:22.957 回答