首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于嵌套属性值的列表中项删除的功能方法

基于嵌套属性值的列表中项删除的功能方法
EN

Stack Overflow用户
提问于 2014-10-08 10:45:04
回答 3查看 2.1K关注 0票数 6

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

我的愿望:

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

条件:

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

代码语言:javascript
复制
[{
    providers: {
        github: {
            login: "username1"
        }
    }

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

}]    

到目前为止,已经成功:

代码语言:javascript
复制
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)的功能?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-08 18:23:35

我刚刚得到了一个拉请求 for R.pathEq合并。在ramda.js的下一个版本(当前版本为0.6.0)之前,它是不可用的,但同时您可以像这样重新创建它:

代码语言:javascript
复制
var pathEq = R.curry(function(path, val, obj) {
    return R.eq(val, R.path(path, obj));
}); 

然后像这样使用它:

代码语言:javascript
复制
 var rejectThis = 'userName1';
 var myFilter = R.useWith(R.reject, pathEq('providers.github.login'):
 var filteredList = myFilter(rejectThis, users);
票数 6
EN

Stack Overflow用户

发布于 2014-10-12 00:10:22

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

代码语言:javascript
复制
// 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);

当然,你也可以这样用它:

代码语言:javascript
复制
var myFilter = rejectPathVal('providers.github.login', 'userName1');
// ...
var filteredList = myFilter(list);

或者你选择的任何方式,因为它是完全仓促的。尽管正如路德维希指出的那样,pathEq并不在发布的Ramda版本中,但是您可以通过从Github下载HEAD版本获得它,或者使用上面提供的版本Ludwig。

但我想问一下你的要求。我赞赏你试图转向一种更实用的风格。我是Ramda的作者之一,我认为这对于图书馆来说是一个很好的选择,但这似乎是不必要的:

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

我建议,可读性的目标应该总是胜过简洁的目标。当然,优雅和可读性往往与简洁联系在一起,但“尽可能短”永远不应该是一个驱动目标。

票数 1
EN

Stack Overflow用户

发布于 2014-10-13 12:32:25

如果您不需要创建函数点为零,您可以简单地:

代码语言:javascript
复制
var removeUserFromList= function(name, list) {
    return R.reject(pathEq('providers.github.login', name), list);
}
console.log(removeUserFromList('username1', users));

使用@Ludwig Magnussen的pathEq函数。

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

https://stackoverflow.com/questions/26255003

复制
相关文章

相似问题

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