기본 콘텐츠로 건너뛰기

라벨이 map인 게시물 표시

[삽질주의] js에선 object를 어떻게 확장하는가? .map 만들기.

http://spectrum.egloos.com/5580651 옛날 글 소환인데 map을 object 에서도 한번 해볼려고 이렇게 시도해 보았다. > Object.defineProperty(Object.prototype, "map", {value: function(fn) {   for (idx in this) this[idx]=fn(this[idx]); return this; } }); > q={a:1, b:2} > q.map(v=>v+1) Object {a: 2, b: 3} ECMA5부터 Object.defineProperty 를 쓸 수 있고 prototype 삽질을 막을 수 있다. > q={a:1, b: {c: 2, d: 4}} > Object.defineProperty(Object.prototype, "map", {value: function(fn) {   let map=(f,arr)=>{     for (idx in arr)         arr[idx]=typeof arr[idx]==="object" && map(f,arr[idx]) || f(arr[idx]);     return arr;   }   return map(fn, this); }}); > q.map(v=>v+1) Object {a: 2, b: Object} a:2 b:Object   c:3   d:5 뭐 의도한대로 잘 나오긴 한다. value 인 경우만 fn을 실행하고 object면 재귀를 사용한다. 뭐 array만 들어와도 이건 망하겠네; google 에서 왜 [[a,2], [b,3]] 따위 자료 구조를 썼는지 어느정도 이해가 된다.

map과 reduce를 사용하여 distinct(group by) 하는 방법

oracle 같은 RDB 를 다루던 시절엔 user | dept ----------- john | 0000 tom | 0001 jack | 0000 jane | 0001 과 같은 형태의 테이블일때 부서의 목록을 뽑아 내고자 group by 나 distinct 를 사용하여 dept ----- 0000 0001 이와 같이 뽑아내곤 했는데 noSQL 을 사용하거나 array collection 형태의 데이터를 다룰때에도 이런 작업을 해야할 경우가 있다. 일단 예제로 다뤄볼 대상 collection 의 구조를 가정해 보자. documents = [   {     _id: "........",     message: "......",     user : {       _id: "........",       profile: {         displayName: "....."       }     } ] 흔한 게시판 형태의 데이터 구조라고 볼 수 있는데 각 documents 마다 고유한 _id 를 가지고 있고 해당 documents 를 작성한 user 객체가 각각 들어있는 경우라고 볼 수 있다. 그렇다면 documents 를 작성한 user 의 목록을 뽑아낼 수는 없을까? node 콘솔이나 브라우저용 개발 툴에서 복사 붙이기 용으로 코드를 예제 코드를 한번 넣어보자면 documents = [ { _id: "doc0001", message: "document 01", user: { _id: "user0001", profile: { displayName: "john", } } }, { _id: "doc0002", message: "document 02", us...

Array function - Iteration

이것만은 꼭 알고 이해하고 손에 익숙해두자. forEach : 배열의 갯수만큼 반복 map : return 값을 인자로 배열을 반환 reduce : return 값과 배열을 인자로 연산 some : return 이 하나라도 참이면 참을 반환 every : return 이 모두 참이면 참을 반환 sort : return 이 참인 기준의 순방향 정렬 filter : return 이 참인 것들의 배열을 반환 배열을 만들고 직접 돌려보고 느껴보자. reduce 로 sum, min, max를 한다던가 every 로 transaction처리를 한다던가 하는 걸 예로 들면 사고의 폭이 좁아질 수도 있으니 돌려보면서 현상을 관찰하는게 좋다. 기타 함수 concat : 배열들을 연결 indexOf : 인자의 위치를 반환 join : 인자로 배열들을 연결 slice : from<to 범위의 배열을 반환 splice : from에서 n개만큼 배열을 잘라내고 그 부분을 반환 push, pop : 배열의 뒷쪽에 넣고 빼기 unshift, shift : 배열의 앞쪽에서 넣고 빼기