2017-01-20 12 views
1

의 내가, map에 사용되는 등, 등 each 기능을 항목을 소요하고 항목을 반환하는 iteratee 기능이 있다고 가정 해 봅시다iteratee 함수를 목록에 적용하는 javascript 함수를 얻는 가장 좋은 방법은 무엇입니까?

바보 예 :

function nameConverter(item) { 
    return { 
     fullName: item.firstName + ' ' + item.lastName; 
    } 
} 

내가 함수가 콜백을 복용 한 경우 꽤 자주 나는 현장에서 자신을 찾을 수 있습니다, 그러나

return getPerson().then(nameConverter); 

: 또는 항목에 대한 약속을 가지고, 그냥 직접 nameConverter 기능을 전달하는 데 쉽게 ation은 또한 iteratee 함수를 사용하여리스트를 반복하는리스트를 취하는 함수를 필요로한다.

return listPersons().then(function(persons) { 
    return persons.map(nameConverter); 
}); 

그것이 짧은 구문이 아니라고 나를 귀찮게 자주를 수행 할 때, 그래서 도우미 함수 생성 : 그것은 이것에 대한 한 줄의 기능을 각 시간을 만들 물론 매우 간단

:

function mapper(iteratee) { 
    return function(list) { 
     return _.map(list, iteratee); 
    } 
} 
는 제가 다음 추가로이 일반화

return listPersons().then(mapper(nameConverter)); 

을 할 수있는 나는 두 map, each, filter 또는 어떤 밑줄/lodash 기능을 위해 같은 일을 할 수 있도록

: 그러나

return listPersons().then(iterator(_.map, nameConverter)); 

같은 표준 자바 스크립트 기능이 더 좋은 방법이 있다면, 나는 궁금합니다 또는 밑줄/로다시의 어떤 것이 이미 똑같은 것을합니까? 그것은 일반적인 경우처럼 보입니다 ...

+0

된다 나는 당신의 해결책을 아주 좋아합니다. 'return listPersons(). then (persons => persons.map (nameConverter)); ' – Tholle

+2

lodash에서 currying 함수를 살펴 보겠습니다. 이터레이터는'_.curryRight (_. map, nameConverter) '로 대체 될 수 있습니다. –

+0

그건 영리합니다.나는 카레를 보았지만, 바로 이것이 결과 일 것이라고 당연히 분명하지 않았습니다. 나는 전용 함수 _applyList 또는 뭔가 lodash 합리적인 추가되었을 것 같아요. :-) – JHH

답변

1

기능은 lodash의 partialRight 기능이 효과적으로 기능하는 것입니다. 즉, 함수에 가장 오른쪽 인수를 부분적으로 적용합니다. 이 partialRight을 있어야 할 곳에 내가 질문에 추가

return listPersons().then(_.partialRight(_.map, nameConverter)); 

NB 코멘트를 잘못 curryRight 사용 : 그래서 위의 예에서

_.partialRightiterator 교체의 하락이다. curryRight는 유사하지만 인수 함수 후에인가하는 기능을 리턴 제 카레 :

let curriedConverter = _.curryRight(_.map); 
curriedConverter(nameConverter) 

또는합니다 (추악한)는

let curriedConverter = _.curryRight(_.map)(nameConverter); 

그래서 반복자 교체 후

return listPersons().then(_.curryRight(_.map)(nameConverter))); // yuk