我正尝试在我的javascript应用程序中更多地进行函数式编程。我目前使用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)的功能?
发布于 2014-10-08 18:23:35
我刚刚得到了一个拉请求 for 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-12 00:10:22
从@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);或者你选择的任何方式,因为它是完全仓促的。尽管正如路德维希指出的那样,pathEq并不在发布的Ramda版本中,但是您可以通过从Github下载HEAD版本获得它,或者使用上面提供的版本Ludwig。
但我想问一下你的要求。我赞赏你试图转向一种更实用的风格。我是Ramda的作者之一,我认为这对于图书馆来说是一个很好的选择,但这似乎是不必要的:
使实现尽可能短,尽可能依赖Ramda库中的现有功能。
我建议,可读性的目标应该总是胜过简洁的目标。当然,优雅和可读性往往与简洁联系在一起,但“尽可能短”永远不应该是一个驱动目标。
发布于 2014-10-13 12:32:25
如果您不需要创建函数点为零,您可以简单地:
var removeUserFromList= function(name, list) {
return R.reject(pathEq('providers.github.login', name), list);
}
console.log(removeUserFromList('username1', users));使用@Ludwig Magnussen的pathEq函数。
https://stackoverflow.com/questions/26255003
复制相似问题