함수형으로 전환
다형성
함수형 프로그래밍은 함수 ⇒ 데이터 이다.
array like 메소드와 같은 것들을 커버할 수 있고, 인자로 전달되는 predi, iter, mapper와 같은 함수들을 이용하여 확장성을 높일 수 있다.
1function _filter(list, predi) { 2 let new_list = []; 3 _each(list, (val) => { 4 if (predi(val)) new_list.push(val); 5 }); 6 return new_list; 7} 8 9function _map(list, mapper) { 10 let new_list = []; 11 _each(list, (val) => new_list.push(mapper(val))); 12 return new_list; 13} 14 15function _each(list, iter) { 16 for (let i = 0; i < list.length; i++) { 17 iter(list[i]); 18 } 19}
커링
1function _curry(fn) { 2 return function (a, b) { 3 return arguments.length === 2 4 ? fn(a, b) 5 : function (b) { 6 return fn(a, b); 7 }; 8 }; 9} 10 11const add = _curry((a, b) => a + b); 12const add10 = add(10); 13console.log(add10(5)); 14console.log(add(10, 5)); 15 16function _curryr(fn) { 17 return function (a, b) { 18 return arguments.length === 2 19 ? fn(a, b) 20 : function (b) { 21 return fn(b, a); 22 }; 23 }; 24} 25 26const sub = _curryr((a, b) => a - b); 27console.log(sub(10, 5)); 28 29const sub10 = sub(10); 30console.log(sub10(5));
get
1const _get = _curryr((obj, key) => obj && obj[key]); 2 3const user1 = users[0]; 4console.log(_get(user1, 'name')); 5 6const get_name = _get('name'); 7console.log(get_name(user1)); 8 9console.log( 10 _map( 11 _filter(users, (user) => user.age > 30), 12 _get('name') 13 ) 14);
_curryr로 name 키값을 찾는 메소드를 생성할 수 있다.