본문 바로가기

Javascript/함수형 프로그래밍

each 메서드 만들어보기

반응형

each

지난번 _map 함수와 _filter 함수에도 똑같이 중복되는 부분이 있었다.

중복제거를 하는 each함수를 만들어본다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
function _filter(list,predi){
  var new_list = [];
  for(var i=0;i< list.length;i++){
    if(predi(list[i])){
      new_list.push(list[i]);
    }
  }
}
function _map(list, mapper){
  var new_list = [];
  for(var i = 0; i < list.length;i++){
    new_list.push(mapper(list[i]));
  }
}
</script>


[기존 코드]

_filter함수는 어떤 배열(list)에서 어떤기준으로 필터링할 함수(predi)를 받아서 새로운 배열을 리턴해주는 것이었고,

_map함수는 필터링된 배열에서 다른 값을 가져오는 mapper 함수를 받아 새로운 배열을 리턴해주었다.


* 여기서 겹치는 부분인 for 반복문과 list[i]와 같이 해당 i번째 값을 찾는 두가지를 each를 통해 중복제거를 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<script>
function _each(list, iter){
  for(var i = 0; i < list.length; i++){
    iter(list[i]);
  }
  return list;
}
function _filter(list, predi){
  var new_list = [];
  _each(list,function(val){
    if(predi(val)) new_list.push(val);
  });
  return new_list;
}
function _map(list, mapper){
  var new_list = [];
  _each(list,function(val){
    new_list.push(mapper(val));
  });
  return new_list;
}
</script>


[_each함수와 변경된 _filter, _map 함수]

_each함수는 어떤 배열을 받아 그대로 리턴하는 함수고, 이터레이터 반복자로 해당 값들을 순회하는 함수다.

 - console.log(_filter(users,function(user){return user.age >= 30;}));

유저의 나이가 30세 이상인 유저들을 리턴하는 _filter 함수를 똑같이 실행해보면 알 수 있다.

새로운 _filter함수는 여전히 배열(list)과 predi(필터함수)를 인자로 받고 있고

_each함수는 배열(list)과 그 배열을 반복하면서 접근할 iter 메서드를 인자로 받는다.

_filter함수 내에서 보면 val에 list[i]가 들어간다고 보면된다. iter가 곧 function(val) {...}이 되기때문. 


반응형