본문 바로가기

Web[웹]/ES6+ 함수형 언어

[ES6+: 응용] 프론트엔드에서 활용하기 (2) [ES6+: 응용] 프런트엔드에서 활용하기 (1) : https://opentogether.tistory.com/82 [ES6+: 응용] 프론트엔드에서 활용하기 (1) #1 프론트엔드에서 함수형/이터러블/동시성 프로그래밍 ES6 템플릿 리터럴 활용 이후에 템플릿 리터럴을 통해 프로그래밍을 해볼 것인데, 템플릿 리터럴의 사용법은 아래와 같다. const a = 10; const b = 5; con.. opentogether.tistory.com 클래스 대신 함수로 하는 추상화 앞 챕터에서 배웠던 코드는 중복이 많았는데, 이를 줄여나가는 추상화를 시켜보자. 먼저, Ui.message를 "확인, 취소"창뿐 아니라, "경고"창도 코드 하나로 구현되게끔 해주자. const Ui = {}; Ui.message = .. 더보기
[ES6+: 응용] 프론트엔드에서 활용하기 (1) #1 프론트엔드에서 함수형/이터러블/동시성 프로그래밍 ES6 템플릿 리터럴 활용 이후에 템플릿 리터럴을 통해 프로그래밍을 해볼 것인데, 템플릿 리터럴의 사용법은 아래와 같다. const a = 10; const b = 5; console.log(`${a} + ${b} = ${a + b}`); // 10 + 5 = 15 이미지 목록 그리기 실습할 CSS 코드 더보기 실습할 JSON 데이터 더보기 [ { name: "HEART", url: "https://s3.marpple.co/files/m2/t3/colored_images/45_1115570_1162087.png" }, { name: "하트", url: "https://s3.marpple.co/f1/2019/1/1235206_1548918825999_7.. 더보기
[ES6+: 응용] 시간을 이터러블로 다루기 #1 take, takeWhile, takeUntil로 코드 다루기 takeWhile, takeUntil 먼저 range와 take를 다시 알아보자. 위 두 개는 즉시 평가되는 것과 지연 평가되는 것으로 나뉘는데 이를 해석해보면 다음과 같다. _.go( _.range(10), /* 0 ~ 9 까지의 배열 */ _.take(3), /* 앞에서부터 3개만 자르기 */ _.each(console.log)); // 0 1 2 _.go( L.range(10), /* 0 ~ 9 까지의 이터러블, 최대 10번 수행 */ L.take(3), /* 최대 3개의 값이 필요하고, 최대 3번의 일을 수행 */ _.each(console.log)); // 0 1 2 위 항목에서 range이후에 delay(1000)이 들어간다면.. 더보기
[ES6+: 응용] 사용자 정의 객체를 이터러블 프로그래밍으로 다루기 #1 사용자 정의 객체를 다루기 map, set 다루기 자바스크립트의 기본객체가 아닌 추가적으로 만들어인 사용자 정의 내장 객체 역시도 이터러블로 프로그래밍을 다룰 수 있다. 먼저 Map을 알아보자. let m = new Map(); m.set('a', 1); m.set('b', 2); m.set('c', 3); 위와 같은 Map도 이터러블로 프로그래밍 하고 다시 새로운 Map으로 생성이 가능하다. _.go( m, _.filter(([k, v]) => v % 2), entries => new Map(entries), console.log); // Map(2) {"a" => 1, "c" => 3} 이어서 Set같은 경우도 마찬가지이다. let s = new Set(); s.add(10); s.add(20).. 더보기
[ES6+: 응용] 객체를 이터러블 프로그래밍으로 다루기 #1 객체를 다루는 함수, 이터러블 프로그래밍화 시키기 values 다루기 다음과 같은 객체가 있다고 보자. const obj1 = { a: 1, b: 2, c: 3, d: 4 }; 먼저 위코드의 values 값들을 콘솔을 통해 출력해보자. console.log(Object.values(obj1)); // [1, 2, 3, 4] 위 처럼 value값들을 뽑아낼 수 있으며, 위 값들을 go함수를 통해 값을 뽑아내는 함수를 보자. _.go( obj1, Object.values, _.map(a => a + 10), _.take(2), _.reduce((a, b) => a + b), console.log); // 23 위 값에서 console.log를 하기까지 단 2개의 값이 필요했지만, 사실상 모든 value.. 더보기
[ES6+: 응용] map과 filter로 하는 안전한 함수 합성 #1 안전한 함수 합성 map으로 합성하기 다음과 같은 합성함수를 선언했다. const f = x => x + 10; const g = x => x - 5; const fg = x => f(g(x)); 위와 같이 함수를 선언했을 때, 아래와 같이 인자값 없이 값을 실행하면 'NaN'으로 에러가 난다. console.log(fg(10)); // 15 console.log(fg()); // NaN - 에러가 난다. 잘못된 값이 들어왔을때, 아무 동작도 하지 않게끔 하려면 어떻게 해야될까? 바로 모나드와 map함수를 통해 안전한 합성을 이룰 수 있다. 위와 똑같은 동작을 하는 함수를 go 함수를 통해 나타내보자. _.go( 10, fg, console.log); // 15 이제, 이것을 안전한 함수 합성을 위.. 더보기
[ES6+: 응용] reduce함수를 통해보는 명령형 습관을 지우기 #1 reduce함수는 만능이 아니다 "reduce" 한개를 쓰는 것 보다 "map + filter + reduce" 를 함께 쓰자 기존 명령형 습관들 때문에, reduce를 오용하는 경우가 자주 있다. const users = [ { name: 'AA', age: 35}, { name: 'BB', age: 26}, { name: 'CC', age: 28}, { name: 'DD', age: 34}, { name: 'EE', age: 23}, ] 위와 같은 users 데이터가 있다. 이를 합산하는 코드를 reduce통해 짜볼 것이다. console.log(_.reduce((total, u) => total + u.age, 0, users)); // 146 위를 보면 total과 u.age라는 서로 다른 .. 더보기
[ES6+: 응용] 명령형에서 함수형으로 변환시키기 #1 명령형 코드를 함수형으로 변환시키기 우리가 이때까지 배웠던 for, if, while 문과 같은 명령형 문을 앞에서 배웠던 함수형으로 간략하게 변환시켜보자. 먼저, '홀수를 n개 더하는' 명령형 코드를 보자. function f1(limit, list){ let acc = 0; for(const a of list){ if(a % 2){ const b = a * a; acc += b; if (--limit == 0) break; } } console.log(acc); // 35 } f1(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); 위 코드는 "리스트를 받아와서 홀수인 값만 뽑아서 거기에 제곱을 하는데, 딱 3개만 뽑고 그 뽑은 값들을 더하는 것"이다. 이 내용을 명령형 코드로 짰.. 더보기