Node.js

<Map / Set>

babydeve 2023. 6. 29. 01:11
const arr = [1,2,3,2,3,5,2]
const s2 = new Set(arr)
s2       //Set(4){1,2,3,5}
Array.from(S2)      //(4)[1,2,3,5]   S2를 배열로 변경한다.

1. Map(객체와 유사)과 Set(배열과 유사)

- 객체와 배열은 자유도가 높기 때문에 다른 사람의 코드를 볼 때 어떤 용도로 썼는지 이해하기 어려울 때가 있다.

 => 그런 점을 보완한 것이 Map, Set

 

1) Map

- 생성자 함수

- 객체의 반복

2) set

- 변수.set( '키', '값' ) : 키와 값으로 이루어진 객체(배열)를 변수에 넣어준다.

3)get

- 변수.get( '키' ) : 생성자함수에서 키(인덱스)에 해당하는 값을 꺼내온다.

const m = new Map()   //Map 생성자함수
m.set('a', 'b') //Map(1){'a' => 'b' }
m.set('c', 'd') //Map(2){'a' => 'b', 'c' => 'd' }
m.get('a')  //'b'
m.set({a: 'b'}, {c: 'd'})  //Map(3){'a' => 'b', 'c' => 'd', { a: 'b' } => { c: 'd' }}
m.get({a: 'b'})  //값 x

const obj = { key: 'key'}   //키는 가져와서 쓸 수 있으나 객체는 같은 참조값을 가져야지만 같은 값이 나온다.
m.set(obj, 123)
m.get(obj)  //123
m.size  //4   배열의 length메서드와 같다.

3) 반복 : for in / for of / forEach

-프로토타입의 속성까지 다 나온다.

- for in : 객체의 반복

- for of : 배열의 반복

- forEach : 콜백함수의 매개변수 반복

- 키, 값 구조가 필요할 때 { } 객체 리터럴 보다 Map함수를 쓰는 것이 간단하고 가독성이 좋다.

//for in 반복(객체)
const obj2 = { }
for(let i in obj2){
	if(obj2.hasOwnProperty(i)){
    	obj2[i]
    }
}

//for of 반복(배열)
for(const [k, v] of m){
	console.log(k, v)
}

//forEach 반복(콜백함수)
m.forEach((v, k) => { console.log(k, v) })

4) 프로퍼티 삭제

- has(키) : 키를 이용해 속성이 존재하는지 확인

- delete(프로퍼티) : 해당 프로퍼티만 삭제

- clear() : 해당 객체/배열을 모두 제거

console.log(m.has(d))   //true
m.delete(obj)      //obj 속성만 삭제
m.clear()      //속성을 모두 제거

 

5. WeakMap

- WeakMap 생성자함수는 키가 없을 때 가비지컬렉팅을 시킨다.

- 객체를 수정하지 않으면서 부가적인 정보를 추가할 수 있다.

- 가비지 컬렉팅도 방해하지 않는다.

* 가비지 컬렉팅 : 필요없어진 영역을 해제하는 기능

const wm = new WeakMap()  //WeakMap 생성자함수는 키의 값이 null일때 가비지컬렉팅을 시킨다.
let obj3 = { }
wm.set(obj3, '123')   //{ { } => '123' }
obj3 = null    //필요없어진 키와 값이 둘 다 사라진다.(가비지컬렉팅)

let obj4 = { }
m.set(obj4, '123')  //Map생성자 함수는
obj = null    //가비지 컬렉팅이 안돼서 obj4가 완전히 사라지지 않고 메모리에만 남아있다.

let user = { name: 'zerocho', age: 29}
wm.set(user, {married: false})
user = null    //{married: false}도 같이 가비지 컬렉팅이 된다.

4. Set

- 생성자함수

- 배열의 반복

- 중복이 있는 배열에서 중복을 제거할 때 또는 중복없는 배열을 만들 때 Set을 사용한다.

- Set은 중복을 허용하지 않는다.

const s = new Set()  //생성자함수
s.add(1)   //Set(1) {1}
s.add(1)   //Set(1) {1}
s.add(2)   //Set(2) {1, 2}
s.size   //2
console.log(s.has(1))   //true
for(const a of s){
	console.log(a)
}
s.forEach((a) => {
	console.log(a)
})
s.delete(2)
s.clear()

 

728x90