高次関数の作成と組み込み方法(下のバー)



高次関数(復習)


高次関数(highorder function)の最大の特徴は,パラメータとして関数を受け入れることである.
したがって、関数として返すこともできます.

  • 戻り関数

  • パラメータとして関数を受信
  • 関数から他の関数パラメータに渡される関数をコールバック関数と呼びます.
    高次関数がコールバック関数に渡されると呼び出されます.
    ex.1)別の関数をパラメータとして受け取った場合
    
    function Plus(num) {
    	return num ++;
    }
    
    
    function plusNum(func, num) {
    	return func(num);
    
    }
    
    // plusNum은 함수를 인자로 받고 있다. (고차함수)
    //func가 그러면 plusNum의 콜백함수이다. 
    
    let result = plusNum(plus, 7);
    console.log(result); // 14
    
    
    ex 2)関数を返す場合
    
    function double(doubles) {
     return function(num) {
     	return num * dobles 
      }
    }
    
    //리턴에서 다른 익명 함수를 리턴하는 고차 함수 
    
    let output = double(2)(6) // 12
    
    console.log(output) // 12
    
    
    //따로 변수에 할당 가능하다. 
    
    const double1 =double(4)
    result = double1(3)
    console.log(result)// 12
    
    
    

    よく使われる高次関数メソッド(map、filter、reduce)


    - map()
    map()メソッドは新しい配列に戻ります.繰り返し文のように配列内の要素を巡り、各要素が所定の関数を呼び出す結果値を収集します.したがって,最初のパラメータとして受信した配列は結果値の配列と同じ長さである.
    let arr1 = [1,2,3,4,5]
    
    function plus(arr1){
    	return arr1.map(el => el + 2)
    }
    
    let result = plus(arr1)
    console.log(result) // [3, 4, 5, 6, 7]
    次に、mapの機能を実現するための組み込み方法を作成します.
    먼저 each를 만들어서 탐색할 수 있게 메소드를 저장한다. 
    
    _.each = function (collection, iteratee) {
      if(Array.isArray(collection)){
        for(let el = 0; el < collection.length; el++){
          iteratee(collection[el],el,collection)
        }
      }else{
        for(let key in collection){
          iteratee(collection[key],key,collection)
        }
      }
    };
    
    map에서는 each를 이용해 arr를 탐색하고 iteratee를 통해 결과값을 내보낸다.
     * iteratee는 함수의 인자로 전달되는 함수이므로 callback 함수
    
    _.map = function (arr, iteratee) {
      let result = []
      _.each(arr, function(el){
        result.push(iteratee(el))
      })
      return result
    };
    
    
    
    - filter()
    filter()メソッドは、所与の関数でテストされたすべての要素を新しい配列に収集します.
    
    function same(arr, alike) {
      return arr.filter(ele => ele === alike)
    }
    
    배열이 들어오면 filter로 arr의 요소와 alike의 요소의 일치하는 값만 리턴한다.
    
    
    
    언더바로 구현
    
    _.filter = function (arr, test) {
     let result = []
     _.each(arr, function(el){
       if(test(el)){
         result.push(el)
       }
      })
     return result 
    }
    
    
    - reduce()
    reduce()メソッドは、アレイ内の各要素に対して所与のreducer関数を実行し、結果値を返します.
    計算機(acc)/現在値(cur)/現在インデックス(idx)/ソース配列(src)
    慈悲として.
    let arr = [1,2,3,4,5]
    
    
    function add(arr) {    
      return arr.reduce((acc,cur) => {
        return acc+cur
      },0)  // ----> 이 부분이 초기값 :0
    }
    
    let result = add(arr)
    console.log(result) // 15
    
    언더바로 구현
    
    initVal는 초기값이다. 
    
    
    _.reduce = function (arr, iteratee, initVal) {
      if(initVal === undefined){
        initVal = arr[0]
        arr = _.slice(arr,1)
      }
      _.each(arr, function(el,idx){
        initVal = iteratee(initVal, el, idx, arr)
      })
      return initVal
    };