donaricano-btn

함수형에서 for 와 if 의 변화


1. for에서 filter로 if에서 predicate로

1) 기존 문장

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var users = [
    {id :1, name :'ID', age:32},
    {id :2, name :'ha', age:30},
    {id :3, name :'bj', age:29},
]
 
//30살 이하의 데이터를 추출하여 새로운 배열에 넣는다
var temp_user = [];
for(var i = 0, len = users.length; i<len; i++){
    if(users[i].age<30){
        temp_user.push(users[i]);
    }
}
console.log(temp_user.length);

2) filter 함수로 변환

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var users = [
    {id :1, name :'ID', age:32},
    {id :2, name :'ha', age:30},
    {id :3, name :'bj', age:29},
]
 
function filter(list, predicate){
    var new_list = [];
    for(var i = 0, len = list.length; i<len; i++){
        if(predicate(list[i])){
            new_list.push(list[i]);
        }
    }
    return new_list;
}
 
var users_under_30 = filter(users, function(user) { return user.age < 30 });
var users_over_30 = filter(users, function(user){return user.age > 30});
console.log(users_under_30.length);
 

- 새로운 배열을 생성하여 반환한다.

- predicate 함수를 이용하여 원하는 반환 값을 얻는다.


2. 중복 코드를 map 함수로 제거한다

1) 기존 문장

1
2
3
4
5
var ages = [];
for(var i = 0, len = temp_user.length; i<len; i++){
    ages.push(temp_user[i].age);
}
console.log(ages);
 

- 새로 만든 배열에서 이름을 추출한다.

2) map 함수로 변환

1
2
3
4
5
6
7
8
9
10
11
function map(list, iteratee){
    var new_list = [];
    for(var i=0, len = list.length; i<len; i++){
        new_list.push(iteratee(list[i]))
    }
    return new_list;
}
 
var ages = map(users_under_30, function(user){return user.age});
var name = map(filter(users, function(user) { return user.age < 30 }), function(user){return user.name});
console.log(ages);
 

- 코드가 더욱 단순해 졌다. 또한 함수를 합쳐서 실행결과로 바로 실행할 수 있다.


3. 클로저를 이용한 map 함수 줄이기

1) 클로저 함수 패턴

1
2
3
4
5
6
7
8
9
function bvalue(key){
    return function(obj){
        return obj[key];
    }
}
 
var b = bvalue('b');
console.log(b({a:'hi',b:'hello'}));
console.log(bvalue('a')({a:'hi',b:'hello'}));
 

2) filter, map, bvalue 

1
var name = map(filter(users, function(user) { return user.age < 30 }), bvalue('name'));
 

- 더욱 간결해 졌다.

블로그 이미지

리딩리드

,