2016-10-04 20 views
1

我決定使用Ramda編寫一個簡單的待辦事項應用程序,但我一直堅持一個與重構相關的問題。我認爲我這裏還有兩個功能可以重構:Ramda.js重構

const isItemCompleted = R.pipe(
    R.prop("states"), 
    R.contains("completed") 
) 

const isItemEdited = R.pipe(
    R.prop("states"), 
    R.contains("editing") 
); 

正如你所看到的,有一些重複代碼,這會得到甚至梅西耶如果我有更多的國家。我一直試圖隔離重複的功能,因此:

const statesContains = R.flip(R.pipe(
    R.prop('states'), 
    R.contains() 
)) 

//I would like to use it like this: 
const isItemCompleted = statesContains("completed") 
const isItemEdited = statesContains("editing") 

但我只是不能包住我的頭圍繞此。我可以使用不同的參數排序來工作,但我想遵循數據最後的規則來創建簡潔的函數。

的數據傳遞給這些isItemCompleted和isItemEdited功能可能是這樣的:

let item = {states:["editing", "complete"]}; 
isItemCompleted(item); //true 

任何(功能)的想法?

回答

3

有幾種方法可以解決這個問題。

也許最直接的方式是

const statesContains = R.curry(
    (state, item) => R.contains(state, R.prop('states', item)) 
); 

const isItemCompleted = statesContains("completed"); 

但它是合理的,希望這個抽象一點,以允許搜索的屬性改變爲好。所以你可以寫:

const propContains = R.curry(
    (propName, state, item) => R.contains(state, R.prop(propName, item)) 
); 

const editorsContains = propContains('editors') 
const edFred = editorsContains('fred'); 

// or edFred = propContains('editors', 'fred'); 

這兩個都是合理的。但拉姆達有一個功能,讀取得非常好,並將滿足這些需求相當好,where。有了這個,你可以簡單地寫:

const isItemCompleted = R.where({states: R.contains('completed')}); 

這,我相信,是最簡單的方法,如果你正在尋找一次性。但是,上述兩者都可以幫助您創建可重用的功能。

你可以看到這一切在行動中Ramda REPL