커링 : 함수의 인자를 다루는 기법, 함수에 필요한 인자가 전부 채워지면 함수를 실행하는 기법
1-1. curry
function _curry(fn) {
return function (a) {
return function(b) {
return fn(a, b);
}
}
}
var add = _curry(function(a, b) {
return a + b;
});
// var add = function(a) {
// return function(b) {
// return fn(a, b);
// }
// }
var add10 = add(10);
console.log(add10(5));
console.log(add(5)(3));
// output : 15
1-2. curry 응용 (인자의 개수에 따라 달라지는 로직)
fucntion _curry(fn) {
return function(a, b) {
return arguments.length === 2 ? fn(a, b) : function(b) { return fn(a, b); };
}
}
var sub = _curry(function(a, b) {
return a - b
})
console.log(sub(10, 3)); // 인자가 2개일 때 바로
console.log(sub(5)(3)); // 인자 1개일 때
var sub10 = sub(10);
console.log(sub10(5));
1-3 _curryr
function _curryr(fn) {
return function(a, b) {
return arguments.length == 2 ? fn(a, b) : function(b) {return fn(b, a);};
}
}
// 인자가 한개씩 들어올 경우는 fn(b, a) 처럼 오른쪽 부터 적용
var sub = _curryr(function(a, b) {
return a - b;
});
console.log(sub(10, 5));
// output : 10 - 5
var sub10 = sub(10);
console.log(sub10(5));
// output : 5 - 10
2-1 _get 만들어 좀 더 간단하게 표현
_get : object와 key를 받아 object[key]를 반환
function _get(obj, key) {
return obj === null ? undefined : obj[key];
}
var user1 = users[0];
console.log(user1.name); // 에러
console.log(_get(user1, 'name')); // undefined
var _get = _curryr(function(obj, key) {
return obj === null ? undefined : obj[key];
});
var user1 = users[0];
console.log(_get('name')(user1));
var get_name = _get('name');
console.log(get_name(user1));
console.log(get_name(users[3]);
console.log(get_name(users[4]);
// 복습하기
consle.log(
_map(
_filter(users, function(user) {return user.age >= 30; }),
function(user) { return user.name; }));
consle.log(
_map(
_filter(users, function(user) {return user.age < 30; }),
function(user) { return user.age; }));
// 위의 코드가
consle.log(
_map(
_filter(users, function(user) {return user.age >= 30; }),
_get('name')));
consle.log(
_map(
_filter(users, function(user) {return user.age < 30; }),
_get('age')));
// 로 간소화 가능