본문 바로가기

Study/VanillaJS

[개념잡기] 함수형 프로그래밍 - (3) each

[개념잡기] 함수형 프로그래밍 - (3) each

서론

배열을 순회하는 함수 each 를 만들어 보자

지난 포스팅까지 작성했던 코드

지난 포스팅에서는 filtermap 함수를 작성해보았다.

const _filter = (list, predi) => {
  var new_list = []
  for(var i = 0; i < list.length; i++) {
    if(predi(list[i])) {
      new_list.push(list[i])
    }
  }
  return new_list
}

const _map = (list, mapper) => {
  var new_list = []
  for(var i = 0; i < list.length; i++) {
    new_list.push(mapper(list[i]))
  }
  return new_list
}

이 두함수는 모두 배열을 순회한다는 공통점을 가지고 있는데 배열 순회 역할을 하는 함수를 만들어 보겠다.

함수형 프로그래밍

each

기존에 배열을 순회하는 로직은 for 문을 이용했다.

for(var i = 1; i < list.length; i++) {
  ...
}

이 부분을 모듈화하여 each 함수를 작성하면

const _each = (list, iter) => {
  for(var i = 0; i < list.length; i++) {
    iter(list[i])
  }
}

첫번째 인자로는 순회할 배열, 두번째 인자로는 함수를 받아 배열을 순회하면서 해당 인덱스에 해당하는 값을 함수의 파라미터로 넘겨준다.

이제 each 함수를 filter, map 함수에 적용해 보겠다.

코드 개선

const _filter = (list, predi) => {
  var new_list = []
  _each(list, (val) => {
    if(predi(val)) {
      new_list.push(val)
    }
  })
  return new_list
}

const _map = (list, mapper) => {
  var new_list = []
  _each(list, (val) => {
    new_list.push(mapper(val))
  })
  return new_list
}

const _each = (list, iter) => {
  for(var i = 0; i < list.length; i++) {
    iter(list[i])
  }
}