2014-10-08 65 views
5

我想在我的JavaScript應用程序中更多地使用函數式編程。我目前使用庫ramda作爲這個基礎庫。基於嵌套屬性值刪除列表中的項目的功能方法

我的願望:

  1. 創建功能removeUserFromList(用戶名,列表)返回在不用戶名匹配列表中的項目。
  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)的東西嗎?

回答

6

我剛剛得到pull requestR.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); 
0

擴展從@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 庫依託現有功能越多越好。

我會建議可讀性的目標應該總是勝過簡潔的目標。誠然,優雅和可讀性常常與簡潔性並列在一起,但「儘可能短」不應該成爲一個推動目標。

+0

謝謝,我會記住下次可讀性>簡潔。編寫較短程序非常有趣。 :)順便說一句。與拉達一起工作很好。 – horte 2014-10-16 09:16:34

1

,如果你不需要創建功能點,免費的,你可以簡單地說:

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

使用@Ludwig馬格努森的pathEq功能。