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