함수형에서 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},
]
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' ));
|
- 더욱 간결해 졌다.