[함수형 프로그래밍과 ES6+] 4. 사용자 정의 map, filter, reduce는 다형성에 있어서 유리하다.

fano·2021년 1월 27일
0
post-thumbnail

map()

추출할 값을 반환하는 함수와 iterator로 새로운 배열을 만들어 반환한다.

const map = (f, iter) => { // iterator iter와 내부함수 f를 전달받는다.
  const result = [];
  for (const el of iter)
    result.push(f(el));
  return result; // FP는 side effect를 일으키지 않고 순수하게 결과값 그대로 반환한다.
}

map의 다형성

기존의 map메서드는 Array.prototype에 정의가 되어 있기에 Array를 상속받지 않는 다른 iterable은 map메서드를 사용할 수 없다.
하지만 앞서 만든 map함수는 property에 해당 메서드가 존재하는지 유무 여부에서 자유롭다.
-> 모든 iterable을 인자로 받을 수 있기에 다형성 (여러가지 타입을 가질 수 있는 능력)에서 유리하다고 할 수 있다.

filter()

iterable을 순회하며 조건에 맞는 값을 내부함수로 판단해 새로운 배열에 포함해 반환한다

const filter = (f, iter) => {
  let result = [];
  for (const el of iter)
    if (f(el)) result.push(el); /
  
  return result;
}

reduce()

iterable값을 하나의 값으로 축약한다.

const reduce = (f, acc, iter) => {
  for (const el of iter) 
    acc = f(acc, el);
  
  return acc;
}
  • acc인자를 전달하지 않으면 iter의 첫 번째 value값을 acc로 사용하게 된다. (ex. reduce((a, b) => a + b, [1, 2, 3])라면 acc가 1이 되고 iter는 [2, 3]이 된다.)

이를 구현하면 아래와 같은 코드가 된다.

const reduce = (f, acc, iter) => {
  if (!iter) {
  	iter = acc[Symbol.iterator]();
    acc = iter.next().value;
  }
  
  for (const el of iter) 
    acc = f(acc, el);
  
  return acc;
}
profile
서비스를 생각하는 개발

0개의 댓글