[英]Functional approach of removing items in a list based on nested property values
我正在嘗試更多地轉向我的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)上?
我剛收到了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);
如果您不需要創建無點函數,您可以簡單地:
var removeUserFromList= function(name, list) {
return R.reject(pathEq('providers.github.login', name), list);
}
console.log(removeUserFromList('username1', users));
使用@Ludwig Magnussen的pathEq
函數。
從@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
不在pathEq
的發布版本中,你可以通過從Github下載HEAD版本來獲得它,或者你可以使用上面提供的Ludwig版本。
但我想稍微質疑你的要求。 我贊賞你試圖轉向更具功能性的風格。 我是Ramda的作者之一,並認為它是圖書館的絕佳選擇,但這似乎是不必要的:
盡可能縮短實現,盡可能依賴Ramda庫中的現有函數。
我建議可讀性的目標應該總是勝過簡潔的目標。 當然,優雅和可讀性通常與簡潔相結合,但“盡可能短”絕不應成為推動目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.