1. 일급함수
함수를 값으로 다룰 수 있는 개념
var f1 = function(a) { return a * a; };
console.log(f1)
함수가 함수를 인자로 받을 수 있음
function f3(f) {
return f();
}
console.log( f3(function() { return 10; }) );
2. add_maker
함수를 리턴하는 함수
function add_maker(a) {
return function (b) {
return a + b;
}
}
var add10 = add_maker(10);
console.log( add10(20) );
function f4(f1, f2, f3) {
return f3(f1() + f2());
}
console.log(
f4(
function () { return 2; },
function () { return 1; },
function (a) { return a * a; }));
3. filter & map
1) 명령형 프로그래밍
var users = [
{ id: 1, name: 'ID', age: 36 },
{ id: 2, name: 'BJ', age: 32 },
{ id: 3, name: 'JM', age: 32 },
{ id: 4, name: 'PJ', age: 27 },
{ id: 5, name: 'HA', age: 25 },
{ id: 6, name: 'JE', age: 26 },
{ id: 7, name: 'JI', age: 31 },
{ id: 8, name: 'MP', age: 23 }
];
var temp_users = [];
for (var i = 0; i < users.length; i++) {
if (users[i].age >= 30) {
temp_users.push(users[i]);
}
}
console.log(temp_users);
var names = [];
for (var i =0; i < temp_users.length; i++) {
names.push(temp_users[i].name);
}
console.log(names);
var temp_users = [];
for (var i = 0; i < users.length; i++) {
if (users[i].age < 30) {
temp_users.push(users[i]);
}
}
console.log(temp_users);
var ages = [];
for (var i =0; i < temp_users.length; i++) {
ages.push(temp_users[i].age);
}
console.log(ages);
자바스크립트는 함수형 프로그래밍 언어이다. 이런 명령형 코드는 지양한다.
2) filter로 리팩토링
function _filter(users, predi){
var new_list = [];
for (var i = 0; i < users.length; i++) {
if (predi(users[i])) {
new_list.push(users[i]);
}
}
return new_list;
}
console.log(
_filter(users, function (user) { return user.age >= 30; }));
console.log(_filter([1, 2, 3, 4], function (num) { return num % 2; }));
3) map으로 리팩토링
function _map(list, mapper){
var new_list = [];
for (var i = 0; i < list.length; i++) {
new_list.push(mapper(list[i]));
}
return new_list;
}
var over_30 = _filter(users, function (user) { return user.age >= 30; })
var names = _map(over_30, function (user) {
return user.name;
});
console.log(names);
var under_30 = _filter(users, function (user) { return user.age < 30; });
var ages = _map(under_30, function (user) {
return user.age;
})
console.log(ages);
4. each
map과 filter도 완벽하진 않다.
중복되는 요소를 완전히 없애진 못하는데 그럴 땐 each
를 사용
function _filter(users, 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;
}
function _each(list, iter) {
for (var i = 0; i < list.length; i++) {
iter(list[i]);
}
return list;
}