향상된 FP 렌즈 - 한 번에 한 단계씩 기능 향상

렌즈 기능lookupGenerator에 대한 다음 구현으로 이전 게시물을 마쳤습니다.

function lookupGenerator(...props) {
  return obj =>
    props
      .reduce((o, p) => 
        p in o ? o[p] : null, obj);
}


이전 버전 이후로 일부 개선 사항을 포함하도록 수정했습니다.

어떤 렌즈가 사용되는지 요약



렌즈는 경로를 정의하는 속성/첨자가 주어진 개체/배열에서 값을 추출하는 데 사용되는 기능입니다. 예를 들어:

const testObject = {
  alpha: [
    {beta: '42', gamma: [ 'A', 'B', 'C']},
    {beta: '666', gamma: [ 'a', 'b', 'c']}
  ]
};

const testLookup = lookupGenerator('alpha', 1, 'gamma', 2);

console.log(testLookup(testObject)); // 'c'


다음과 같이 렌즈가 개체 배열에 대한 메서드 내에서 적용될 때 렌즈가 실제로 고유하게 되는 경우는 다음과 같습니다.

const betaLookup = lookupGenerator('beta');

testObject.alpha.forEach(obj => console.log(betaLookup(obj)));

// Output: 42, 666


위의 예에서 testObject 는 매우 작고 단순하지만 이 기술을 사용하여 sort , map 또는 filter 와 같은 메서드를 통해 더 복잡한 객체 배열을 전달한다고 상상해 보십시오.

그렇다면 위 구현의 한계는 무엇입니까?



이전 게시물에서 설명한 것처럼 위의 기능은 재사용을 개선하기 위해 부분 적용을 사용합니다. 이 함수는 필요한 값을 찾기 위해 개체를 탐색하는 데 사용되는 속성(및 첨자) 목록을 제공하기 위해 두 번 호출됩니다. 이것은 호환 객체(또는 배열)로 호출하여 여러 번 사용할 수 있는 함수를 반환합니다.

개체를 통해 필수 속성에 대한 경로를 규정하는 몇 가지 방법이 있습니다. 위의 예에서 속성 이름 및 배열 첨자의 배열이 제공되었지만('alpha', 1, 'gamma', 2) 다른 방법은 다음과 같이 경로를 문자열로 제공하는 것입니다'alpha[1].gamma[2]' .

function lookupGenerator(...props) {
  return obj =>
    props
      .join('.')
      .split(/[\[\]\.]+/)
      .filter(item => item !== '')
      .reduce((o, p) =>
        typeof o === 'object' && o != null && 
        p in o ? o[p] : undefined, obj);
}


위의 구현은 처방 접근 방식 중 하나 또는 둘 모두를 지원할 수 있습니다.

Input options
-------------

lookupGenerator('alpha', 1, 'gamma', 2);  // arguments
lookupGenerator('alpha[1].gamma[2]');     // string
lookupGenerator('alpha[1]', 'gamma[2]');  // string arguments



어떻게 작동합니까?



먼저 모든 문자열을 결합하여 각 시퀀스를 구분하는 점이 있는 단일 문자열을 형성합니다. 그런 다음 정규식(RegExp) 일치를 사용하여 각 속성 이름과 배열 첨자를 분리합니다. RegExp의 기능에 대한 논의를 보려면 this of my를 읽어보십시오.

분할 작업의 결과인 세그먼트 배열은 이전과 같이 reduce 메서드에 표시되기 전에 필터링해야 하는 빈 일치 항목을 생성할 수 있습니다. 마지막으로 우리는 reduce 메소드가 프로퍼티를 찾지 못하거나 프로세스 중간에 null을 찾아 예외를 던지는 것을 방지해야 합니다.

이 보충 자료가 유익한 정보였기를 바라지만 아래 토론 섹션에서 관련 질문을 제공하면 기꺼이 답변해 드리겠습니다.
partial application에 관심이 있다면 에 대한 내 게시물에도 관심이 있을 수 있습니다.

좋은 웹페이지 즐겨찾기