2016-10-04 4 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") 

을하지만 난 그냥이 주위에 내 머리를 정리 할 수 ​​없습니다 나는 같은 중복 기능을 분리하는 것을 시도하고있다. 다른 인수 순서로 작동하도록 만들 수 있지만 간결한 함수를 만들기 위해 데이터 마지막 ​​규칙을 따르고 싶습니다.

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

모든 (기능) 아이디어 :

데이터는 다음과 같이 될 수 이러한 isItemCompleted 및 isItemEdited 함수에 전달되는?

답변

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'); 

이 두 가지가 적당하다. 그러나 Ramda는 정말 잘 읽는 기능을 가지고 있으며, 이러한 요구를 꽤 잘 처리 할 것입니다. where. 이를 통해 다음과 같이 간단하게 쓸 수 있습니다.

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

일회용을 찾는 가장 간단한 방법이라고 생각합니다. 하지만 위의 두 가지 모두 재사용 가능한 기능을 만드는 데 도움이 될 수 있습니다.

당신은 Ramda REPL

의 행동이 모든 것을 볼 수 있습니다