기본 콘텐츠로 건너뛰기

라벨이 map인 게시물 표시

Object.groupBy (배열 그륩핑)

 배열을 다루다 보면, 그륩핑을 해야하는 경우가 있다.  뭐 그러다 보면 아래처럼 불편한 코드가 생성 될 것이다. const list = [ { class : 'a' , score : 1 }, { class : 'a' , score : 2 }, { class : 'a' , score : 3 }, { class : 'a' , score : 4 }, { class : 'b' , score : 1 }, { class : 'b' , score : 1 }, ] const group = {}; for ( const item of list ) { group [ item . class ] = group [ item . class ] || [] group [ item . class ]. push ( item ) } console . log ( 'group' , group )  뭐 reduce를 사용 하게 되면 아래 코드 처럼 되겟지... const list = [ { class : 'a' , score : 1 }, { class : 'a' , score : 2 }, { class : 'a' , score : 3 }, { class : 'a' , score : 4 }, { class : 'b' , score : 1 }, { class : 'b' , score : 1 }, ] const group = list . reduce ( (groupRes, item) => { groupRes[item. class ] = groupRes[item. class ] || [] groupRes[item. class ]. push (item) return groupRes }, {} ) co...

Functor.map?

 배열은 펑터인가? 맞다. map함수가 있으니 맞다. 그러면 map이 무엇인가? 사실 우리는 map이라는 함수를 만나기 전부터 map이라는 단어를 프로그래밍하는 도중 만난적이 있다.  Map이라는 자료 구조인데 키와 값을 같은 자료 구조이다. Map이라는 자료 구조자체가 키에 값을 대응시킨다. 라는 매핑에서 따서 만들어 진 자료구조일 것이다.  사실 자료구조에서 Map과 Functor.map은 같은 단어이다. 지난 내용으로 범주론을 설명하면서 A범주에서 B범주로 대응시키는 것이다. 함자라고 하였다. 그리고 그 대응시키는 함수가 사상(map)이라고 부른다.  자 그러면 오해를 풀어보자. 우리가 생각하는 map?  [1, 2, 3, 4].map( x => x + 1 ) 이 문장을 보면 우리는 배열의 데이터를 순환하면서 1씩 더해주는 무언가로 보기 때문에, map에서 순환이라는 내용을 내려놓기 힘들다.  하스켈에서 정의한 Funtor는 무엇일까?   fmap :: (a -> b) -> fa -> fb  해석을 하면  1. a를 받아 b를 리턴하는 함수를 인자로 받는다.  2. a가 담긴 functor를 받아 b가 담긴 functor를 리턴한다.    자바스크립트로 구현하면 위의 내용은 어떤 모양일까? function Functor (value) { this . value = value this . map = function (cb) { return new Functor (cb( this . value )) } }  간단하게 Functor를 구현해볼 수 있다. 당연하게도 배열을 넣게 되면 그 배열을 제대로 순회하지 못할 것이라는 것을 알 것이다. 그 부분은 다음 장부터 한번 풀어보도록 하자.  학습하면서 진행하는 블로그이며, 함수형 프로그래밍과 관련된 내용을 마치고 나서 이 산이 아닌가벼....

map, filter, reduce (go, curry)

 간단하게 map, filter, reduce를 구현해보자. 1. map은 인자를 두개를 받으며, 첫번째 인자를 받아서 두번째 인자로 평가 후 배열로 리턴해준다. const map = ( iter , func ) => { const ret = [] for ( const item of iter ) { ret. push ( func( item ) ) } return ret }  위와같이 간단하게 짤 수 있다. 2. filter를 구현해보자 map과 두개의 인자를 받으며, 첫번째 인자를 받아서 두번째 인자로 평가 후 값이 있다며 배열로 리턴을 해준다. const filter = ( iter , func ) => { const ret = [] for ( const item of iter ) { if ( func( item ) ) { ret. push ( item ) } } return ret }   3. reduce는 세개의 인자를 받으며, 첫번째 인자를 받아서 두번째 인자로 받은 함수로 평가하며 축적된 값을 리턴을 한다, 이때에 세번째 인자를 초기값으로 이용한다. const reduce = ( iter , func , acc ) => { for ( const item of iter ) { acc = func(acc , item) } return acc }  이와 같이 표현 할 수 있지만, 초기값을 안넣은 경우에는 iter의 첫번째 값을 초기값으로 사용하게 변경 해보자. const reduce = ( ...args ) => { let iter = args[ 0 ] const func = args[ 1 ] let acc = args[ 2 ] if ( args. length < 3 ) { iter = iter[ Symbol . iterator ]() acc = iter. next (). value } ...