2015-10-17 28 views
2

這是我第一次與ramda一起玩。我試圖創建一個map函數,它自動爲數組中的每個對象添加一個鍵。將是有益的反應無狀態的功能,例如,我們可能有一個函數簽名Ramda幫助:Pointfree實現w /佔位符指示參數

({ prop1, prop2, key }) => ... 

[{ prop1: 'prop one', prop2: 'prop two' }, {...etc}] 

這裏的工作示例數組:

const mapI = R.addIndex(R.map); 
const mapAddIndexedProp = R.curry((key, fn) => mapI(R.pipe(R.flip(R.assoc(key)), fn))); 
const mapAddKeyProp = mapAddIndexedProp('key'); 

但是,看到我真正想要的是一個接受一個字符串和一個函數的函數,似乎應該有一種方法來做這樣的事情:

const mapAddIndexedProp = mapI(R.pipe(R.flip(R.assoc(<arg1>)), <arg2>)); 

但我找不出如何工作。任何想法將不勝感激。

或者,很可能有更清晰的方法來處理「over」或換能器。謝謝!

+0

您是否希望將'[{first:'Alice',last:'Jones'},{first:'Bob',last:'Smith'}]'列表變成像[[first :'Alice',last:'Jones',fullName:'Alice Jones'},{first:'Bob',last:'Smith',fullName:'Bob Smith'}]'? – davidchambers

+0

這可能是最終函數的最終目標,因爲@Scott Sauyet在addFullNames中有以下內容,但其想法是抽象爲作爲地圖變換的一部分的對象添加一個對象,並且在要調用的函數之前這個新的地圖功能。仍然不是很清楚,但基本上這將啓用調用newMapWithKey(someFn,[{...},{...}])。在我給出的例子中,調用mapAddKeyProp(someFn,[{...},{...}]將在每個對象之前添加[{key:0 ...},{key:1 ...}]傳遞給某些可能需要使用該密鑰的Fn。 –

回答

2

我認爲這是相當簡單的做,如果你不嘗試堅持使它自由點-:

const addKey = R.curry((key, fn, vals) => 
    R.map(obj => 
     R.assoc(key, fn(obj), obj), vals)); 

如果你真的想要做索引,以及,你可以把它擴展成:

const addKey2 = R.curry((key, fn, vals) => 
    R.addIndex(R.map)((obj, idx) => 
     R.assoc(key, fn(obj, idx), obj), vals)); 

你可以使用是這樣的:

const addFullNames = addKey('fullName', person => 
    `${person.first} ${person.last}` 
); 

const initials = person => R.head(person.first) + R.head(person.last); 
const addIds = addKey2('id', (person, idx) => `${initials(person)}_${idx}`) 

var people = [ 
    {first: 'Wilma', last: 'Flintstone'}, 
    {first: 'Betty', last: 'Rubble'} 
]; 

addFullNames(people); //=> 
// [ 
//  {first: 'Wilma', last: 'Flintstone', fullName: 'Wilma Flintstone'}, 
//  {first: 'Betty', last: 'Rubble', fullName: 'Betty Rubble'} 
// ]; 

addIds(people); //=> 
// [ 
//  {first: 'Wilma', last: 'Flintstone', id: 'WF_0'}, 
//  {first: 'Betty', last: 'Rubble', id: 'BR_1'} 
// ]; 

我敢肯定有辦法讓這個興趣NTS-免費。但我也很確定它會顯得不那麼優雅。

+0

是的,那就是訣竅,沒有管道和翻蓋就乾淨利落,這有助於它更接近無點狀態,同時確保犧牲可讀性。還有'無點'是我想到的這個詞。謝謝,這實際上是我第一次聽到它,以及我正在嘗試使用該功能。我希望拉姆達可能有一種方式來指導如何應用論證(R .__和R.nthArg或某種組合的某種組合),以實現這種無點理想,但它可能不值得這個案例。謝謝! –

+0

如果你還有一段時間,我認爲使這個點免費有一些類似於你在這裏給出的答案:http://stackoverflow.com/questions/29617142/how-to-rewrite-this-in-terms-of-r -撰寫。那裏的代碼現在執行一個錯誤,「__arity的第一個參數必須是不大於10的非負整數」。你有什麼機會可以幫助我理解代碼/錯誤,並且可能進一步實現我在這裏對無點執行的愚蠢追求? –

+0

這是我所指的代碼:// take :: Number - > Object - > Object var take = R.converge( R.選擇, R.useWith(R.take,R.identity,R.keys), R.nthArg(1) ); –