함수형으로전환하기(_each) - part2

보시면 _filter와 _map함수에서 중복되는 코드를 확인하실 수 있습니다.
.
.
.
중복되는 부분

  1. for문(루프)
  2. 해당 i번째 list를 참조하는 부분

위의 중복되는 부분을 _each라는 함수로 따로 빼내서 제거할 수 있습니다.

1
2
3
4
5
6
function _each(list, iter){
for(var i =0 ; i < list.length; i++) {
iter(list[i]);
}
return list; //없어도 실행되는데 문제는 없음.
}

이 _each라는 함수는 인자로 list와 iter를 받아서 반복을 하는 함수입니다.
중복되는 for문을 그대로 가져오고, 받은 값을 그대로 리턴합니다.

간단히 말해 _each함수는 for문의 역할을 완전히 위임하는 함수라고 보면 됩니다.


먼저 _filter함수를 _each함수로 리펙토링합니다.

1
2
3
4
5
6
7
8

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

_each(list, function(val)) –> _each함수에서 list의 특정 i번째 요소를 하나하나씩 꺼내서 iter함수를 실행시킵니다.
위에서는 iter함수로 function(val){ if(predi(val)) new_list.push(val);} 를 보냅니다. 특정 i번째 요소들이 val로 들어가고
predi라는 조건이 true일때 val값이 new_list에 담겨 리턴됩니다.


그다음 _map함수도 _each함수로 리펙토링합니다.

1
2
3
4
5
6
7
function _map(list, mapper){
var new_list = [];
_each(list, function(val){
new_list.push(mapper(val));
});
return new_list;
}

_each함수에서 꺼내진 특정 i번쨰 요소들은 mapper에게 보냅니다.
여기에서는 mapper가 특정 i번쨰 요소의 name이나 age를 리턴합니다.
mapper(val)의 리턴값이 new_list에 담겨지고, 최종적으로 new_list를 리턴합니다.

.
.
.
.


다음 포스팅에서는 다형성에 대해서 배워볼게요!

Share