본문 바로가기

Backend/함수형 자바스크립트

(19)
Partial.js (2) 이전 포스팅 참고 Partial.js 에서의 비동기 제어에 대해 좀 더 알아볼까 합니다. 사실 async-await syntax 를 사용하는 요즘의 코드에선 이 내용이 큰 의미가 없을 것 같다는 생각도 들지만, 동기와 비동기 코드 구조를 동일하게 가져간다는 관점에서 보도록 하겠습니다. - 비동기 제어가 되는 고차 함수 Underscore.js 나 Lodash 의 _.each, _.map, _.reduce 등의 함수들은 비동기 함수를 iteratee 로 사용할 수 없습니다. 예시를 먼저 보도록 하겠습니다. const _ = require('lodash'); const result = _.map([1, 2, 3], function() { return new Promise((resolve) => { setTi..
Partial.js (1) 함수형 자바스크립트를 더 많은 영역에서 사용하기 위해 기능을 확장한 Partial.js 에 대해 더 알아보고자 합니다. 이미 이전 포스팅에서 Partial.js 의 _.pipe, _.go 함수에 대해선 어느정도 맛을 보았습니다. _.pipe 는 실행 준비가 된 함수를 반환하는 파이프라인 함수고, _.go 는 즉시 실행하는 파이프라인 함수입니다. _.go 를 사용할 때 2개 이상의 인자를 넘기기 위해선 _.mr 을 사용하는 것도 봤었습니다. 이번엔 좀 더 다른 예시들을 볼까 합니다. - 함수를 리턴하는 함수와의 조합 const _ = require('partial-js'); const products = [ { id: 1, price: 10000, isDiscount: true }, { id: 2, pri..
함수 조립 (2) 이전 포스팅 참고 - 함수의 연속적인 실행 • 체인 방식 체인 방식은 메서드를 연속적으로 실행하면서 객체의 상태를 변경해 나가는 기법입니다. 이 방식은 표현력도 좋고 실행 순서를 눈으로 따라가기에도 좋고, 여러 장점을 갖고 있습니다. 제가 실제 작업시 사용했던 예시 코드를 간단히 보도록 하겠습니다. const itemCost = function(cost) { let modifiedCost = cost; const modify = function(fn, opts) { modifiedCost = fn(modifiedCost, opts); return this; }; const get = function() { return modifiedCost; }; return { modify, get }; }; cons..
함수 조립 (1) 이전 포스팅에서 계속 해왔던 것 처럼 함수형 자바스크립트 기법을 잘 활용하면 작은 단위로 쪼갠 함수들을 조합해 큰 기능을 만들어 조합된 함수 사이에 새로운 함수를 추가하는 식으로 기능을 확장해 나갈 수 있습니다. 작은 함수를 조립해서 큰 함수를 만드는 부분에 어울릴만한 함수형 자바스크립트 라이브러리인 Partial.js 에 대해 알아보고자 합니다. - 부분 적용 Partial.js 를 알아보기 전에, Underscore.js 에 있는 _.partial 함수에 대해 보도록 하겠습니다. const _ = require('underscore'); const test1 = _.partial(console.info, 1); test1(2); // 1 2 test1(2, 3); // 1 2 3 const test2..
Underscore.js - _.reduce 이전 포스팅 참고 - _.reduce native javascript 의 Array.prototype.reduce 메서드나 Underscore.js 의 _.reduce 함수 모두 값의 리스트를 하나의 값으로 만드는 기능을 합니다. 먼저 예시를 몇 개 보도록 하겠습니다. const _ = require('underscore'); const test1 = [1, 2, 3, 4].reduce((acc, cur) => acc + cur, 0); console.info(test1); // 10 const test2 = _.reduce([5, 6, 7, 8], function(memo, val) { return memo + val; }, 0); console.info(test2); // 26 사용법은 둘 다 비슷합..
Underscore.js - _.reject & _.find 이전 포스팅 참고 - _.reject 이전 포스팅에서 _.filter 를 만들어봤었는데, 그 최종 형태는 아래와 같았습니다. _.filter = frame(_.emptyArray, _.if(_.identity, _.applyRest(_.push))); 이번에 만들어 볼 _.reject 는 _.filter 와 반대로 동작하면 됩니다. 즉 _.filter 는 조건을 만족하는 값들만 모아서 새로운 배열을 만들었다면 _.reject 는 조건을 만족하지 않는 값들만 모아서 새로운 배열을 만듭니다. // _.noop 사용 _.reject = frame(_.emptyArray, _.if(_.identity, _.noop, _.applyRest(_.push))); const test1 = _.reject([1, 2, ..
Underscore.js - _.filter - _.filter 구현 Underscore.js 의 _.filter 는 특정 조건을 만족하는 값들만 모은 새로운 배열을 만드는 함수입니다. 예전 포스팅에서 이미 _.filter 를 아래처럼 구현해보긴 했었습니다. _.filter = (list, predicate) => { const newList = []; for (let i = 0 ; i < list.length ; i++) { if (predicate(list[i], i, list)) newList.push(list[i]); } return newList; }; 위 구현에서 list 는 Array 만 가능합니다. 따라서 {}, [], arguments, ArrayLike 를 처리할 수 있도록 for loop 부분만 이전에 만들었던 _.each 로 ..
Underscore.js - _.map & _.each - _.map 구현 및 활용 Underscore.js 에서 _.map 함수는, 앞선 포스팅에서 말한 것처럼 {}, [], arguments, ArrayLike 를 인자로 받아 iteratee 함수를 돌려 값을 변형시키고 변형된 값을 배열 형태로 반환합니다. 먼저 getLength 와 isArrayLike 함수를 만듭니다. const MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; const getLength = function(list) { return (list === null || list === undefined) ? void 0 : list.length; }; const isArrayLike = function(list) { const length = getLength(lis..