TIL

[TIL] #20. 고차함수 직접 구현해보기

누코(nuuco) 2022. 12. 6. 03:04

2022.5.27. (금)

1. 오늘의 소감

  • 오늘은 배열의 고차함수들을 직접 구현해보는 과제를 진행했다. 콜백함수 생각하며 코드를 짜다보니 머리가 아프긴 했는데, 솔직히 조금 어려운만큼 정말 재밌었다. 나에게 딱 맞는 난이도랄까? 물론 어드밴스드 단계의 마지막 문제(_.sortBy) 와 나이트메어 단게는 손도 못댔지만….;;
  • underscore.js 라이브러리 레퍼런스 참고하기!
  • 실시간 세션에서 크루님이 BareMinimum 코드를 보여주셨는데, 내가 짠 것보다 훨씬 깔끔해서 놀랐다. 특히 _.reduce 함수 부분은 내가 생각지도 못한 로직으로 푸셔서 많은 공부가 되었다. 자세한 내용은 아래에!
  • 내가 처음 짠 리듀스 코드…
_.reduce = function(arr, iteratee, initVal) {
    let acc;
    let cur;
    let startIdx;

    if(initVal === undefined){
        acc = arr[0];
        cur = arr[1] !== undefined ? arr[1] : undefined;
        startIdx = 1;
    } else {
        acc = initVal;
        cur = arr[0];
        starIdx = 0;
    }

    _.each(arr, function(ele, idx){
        if(idx >= startIdx){
            acc = iteratee(acc, ele, idx, arr);
        }
    }
}
  • 크루님이 짜신 코드…
_.reduce = function(arr, iteratee, initVal) {
    let acc = initVal;

    _.each(arr, function(ele, idx, arr){
        if(acc === undefined){
            acc = arr[0];    
            //acc = arr[0], ele = arr[0]
            //초기값이 없을 때, 첫번째 요소에서 iteratee 실행은 건너 뜀
        } else {   //acc = arr[0], ele = arr[1];
            acc = iteratee(acc, ele, idx, arr);
        }
    })

    return acc;
}

⇒ reduce 는 초기값이 없을 때 acc = arr[0], cur = arr[1] 이 세팅된다. 이걸 나는 정말 의미 그대로 풀어서 밖에 구현할 수 없었다. 그런데 크루님은 이걸 “그럼 첫번째 반복에서는 acc 에 arr[0] 만 넣어주고, iteratee 실행을 안하면, 두번째 반복에서는 자연스럽게 acc = arr[0], cur = arr[1] 이 세팅되겠구나!” 로 풀으신 게 놀라웠다!! 멋지다. 이런 추론력…

728x90
반응형