TIL 👩🏻‍💻

TIL : 고차함수

heesue 2021. 3. 16. 23:26

1. 일급 객체 -> 함수

- 변수에 할당할 수 있다.

- 다른 함수의 인자로 전달될 수 있다.

- 다른 함수의 결과로서 리턴될 수 있다.


2. 고차 함수 : 함수를 인자로 받거나 함수를 리턴하는 함수

다른 함수의 인자로 전달되는 함수 = 콜백 함수

함수를 리턴하는 함수만을 일컫는 용어 = 커리 함수

엄밀한 의미에서 고차 함수는 커리 함수를 포함한다.

1. 다른 함수를 인자로 받는 경우
function double(num) {
  return num * 2;
}

function doubleNum(func, num) {
  return func(num);
}

// 함수 doubleNum은 다른 함수를 인자로 받는 고차 함수다.
// 함수 func는 함수 doubleNum의 콜백 함수다.
// 아래와 같은 경우, 함수 double은 함수 doubleNum의 콜백 함수다.
let output = doubleNum(double, 4);
console.log(output); // -> 8
2. 함수를 리턴하는 경우
function adder(added) {
  return function (num) {
    return num + added;
  };
}

// 함수 adder는 다른 함수를 리턴하는 고차 함수다.
// adder는 인자 한 개를 입력받아서 함수(익명 함수)를 리턴한다.
// 리턴되는 익명 함수는 인자 한 개를 받아서 added와 더한 값을 리턴한다.

// adder(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있다.
let output = adder(5)(3); // -> 8
console.log(output); // -> 8

// adder가 리턴하는 함수를 변수에 저장할 수 있다.
// javascript에서 함수는 일급 객체이기 때문이다.
const add3 = adder(3);
output = add3(2);
console.log(output); // -> 5

3. 내장 고차 함수

1. filter 메서드 : 배열의 요소 중 특정 조건을 만족하는 요소들만을 걸러낸다.

2. map 메서드 : 배열의 요소들을 특정 함수를 통해 새로운 배열로 반환한다.

3. reduce 메서드 : 배열의 요소들을 특정 함수를 통해 하나의 형태로 응축한다.


 

4. 고차함수 예제

1. 배열과 임의의 값(discarder)을 입력받아 discarder와 일치하는 요소가 제거된 새로운 배열을 리턴
function removeElement(arr, discarder) {
  return arr.filter(function (el) {
    if (el !== discarder) {
      return true;
    }
    return false;
  });
}
2. 개인 정보를 담고 있는 객체를 요소로 갖는 배열을 입력받아 이름 전체를 요소로 갖는 배열 리턴
function getFullNames(arr) {
  return arr.map(function (person) {
    return `${person.firstName} ${person.lastName}`;
  });
}
3. 2차원 배열을 입력받아 배열들의 요소를 모두 담고 있는 단일 배열을 리턴
function joinArrayOfArrays(arr) {
  let result = arr.reduce(function(pre, cur) {
    return pre.concat(cur);
  })
  return result;
}
4. 2차원 배열을 입력받아 모든 수(number)의 합을 리턴
function sumOfArraysInArray(arr) {
  let result = 0;
  arr.map(function(el) {
    el.map(function(pr) {
      if (typeof pr === 'number') {
        result += pr;
      }
    })
  })
  return result;
}

// solution 2
// function sumOfArraysInArray(arr) {
//   const joinedArr = arr.reduce(function (acc, cur) {
//     return acc.concat(cur);
//   });

//   const onlyNumbers = joinedArr.filter(function (el) {
//     return typeof el === 'number';
//   });

//   return onlyNumbers.reduce(function (acc, cur) {
//     return acc + cur;
//   }, 0);
// }

'TIL 👩🏻‍💻' 카테고리의 다른 글

TIL : DOM  (0) 2021.03.18
TIL : Algorithm Basic  (0) 2021.03.18
TIL : Twittler 목업 구현하기  (0) 2021.03.15
TIL : Javascript Koans  (0) 2021.03.12
TIL : Command Line, Git  (0) 2021.03.11