조건부로 다른 어레이에 대해 어레이 필터링

이 기사 시리즈에서는 몇 가지 실제 사용 사례를 살펴보고 기능적 스타일로 깨끗한 JavaScript를 작성하는 방법을 살펴봅니다. 따라가려면 함수형 프로그래밍과 ramda에 대해 약간의 이해가 필요할 수 있습니다.

문제 설명



문자열 배열을 query로, 또 다른 문자열 배열을 target로 취하는 함수를 빌드해야 합니다. 이 함수는 target 의 항목으로 시작하는 query 의 해당 문자열이 포함된 배열을 반환해야 합니다.
예를 살펴보겠습니다.query

["pen", "paper"]

target

["pen", "pencil", "paper", "", "books", "paperback"]

결과는

["pen", "pencil", "paper", "paperback"]

해결책



먼저 최종 솔루션을 살펴본 다음 분석해 보겠습니다.




우리의 textStartsWith 함수는 query를 인수로 취하고 target를 받아들이고 결과를 반환하는 다른 함수를 반환합니다.

파이프 기능을 살펴보면 더 재미있어집니다




const textStartsWith = pipe(map(startsWith), anyPass, filter);


map(startsWith)는 실제로 각각 query의 항목에 해당하는 술어 배열을 만듭니다. 이 술어 목록은 anyPass로 전달됩니다. 이제 우리가 가진 것은 주어진 문자열이 true의 문자열로 시작하는 경우 query로 해석되는 단일 조건자입니다. 이제 이 술어를 필터의 인수로 전달할 수 있습니다. 이제 문자열 목록으로 textStartsWith를 호출하거나 query 술어가 이미 부분적으로 적용된 필터 함수를 반환합니다. 이제 target 배열을 이 함수의 인수로 전달하기만 하면 됩니다.



추신 솔루션에 대한 더 많은 통찰력이 필요한 경우 스택 오버플로에 대한 이 스레드를 확인하십시오.






startsWithanyPass를 다음과 같이 결합합니다.



<사업부 클래스="스니펫 코드">
const textStartsWith = pipe (
  map (startsWith), 
  anyPass,
  flip (o) (String),
  filter
)

console .log (
  textStartsWith 
    (['pen', 'paper']) 
    (['pen', 'pencil', 'paper', '', undefined, true, 'books', 'paperback'])
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js"></script>
<script>const {pipe, map, startsWith, anyPass, flip, o, filter} =



</p>










좋은 웹페이지 즐겨찾기