簡體   English   中英

基於嵌套屬性值刪除列表中項目的功能方法

[英]Functional approach of removing items in a list based on nested property values

我正在嘗試更多地轉向我的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)上?

我剛收到了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM