Map
k-v 쌍으로 이루어진 자료 구조로, key를 통해 데이터에 빠르게 접근할 수 있는 자료 구조이다.
검색, 삽입, 제거, 존재 여부 확인 모두 O(1)의 시간 복잡도를 가짐.
단, 중복을 허용하지 않는다.
중복을 신경쓸 필요가 없고, 자료의 수정이 빈번하게 일어날 때 배열 대신 사용해주면 좋다.
1. 선언
js의 built-in 객체이므로 new를 이용해 사용할 수 있다.
let m = new Map()
console.log(m) // Map(0) {}
초기 값을 주고싶다면 iterable한 요소를 주면 된다.
k-v 각각이 필요하므로, 1차 배열보다 2차 배열로 인수를 넘겨줘서
각 1차 배열의 두 요소가 k ,v가 되도록 한다.
let tArr = [[1, "a"], [2, "b"], [3, "c"]]
let m2 = new Map([...tArr])
console.log(m2)
// Map(3) { 1 => 'a', 2 => 'b', 3 => 'c' }
2. methods
1. size
map의 크기를 구한다. 엄밀히 말하면 method는 아니고 map 객체의 속성 중 하나.
let size = m2.size console.log(size) // 3
2. get
k를 인수로 넣어 그 k에 대응하는 v를 가져오는 함수
(map에 k가 없다면 undefined)
console.log(m2.get(1)) // a
// key가 해당 map에 없다면 undefined
console.log(m2.get(4)) // undefined
3. set
k, v값을 추가하거나 이미 k가 있다면 대응하는 v를 변경한다.
m2.set(1, "z")
m2.set(4, "d")
console.log(m2) // Map(4) { 1 => 'z', 2 => 'b', 3 => 'c', 4 => 'd' }
4. delete
key를 이용해 해당하는 k-v쌍을 map에서 제거
m2.delete(2)
console.log(m2) // Map(3) { 1 => 'z', 3 => 'c', 4 => 'd' }
5. has
해당 key가 map에 있는지 확인하는 함수
console.log(m2.has(2)) // false
console.log(m2.has(4)) // true
6. clear
map의 모든 key를 제거해 빈 map으로 만들어줌.
m2.clear()
console.log(m2) // Map(0) {}
여기까지가 기본적인 method고,
이제 배열처럼 map에서도 각 요소에 대해 반복적인 작업을 수행하는 방법을 알아보자.
3. iterable
1. for-of문
for-of문을 이용해 key, value를 반복해 출력할 수 있다.
let tArr = [[1, "a"], [2, "b"], [3, "c"]]
let m3 = new Map([...tArr])
for(let [k,v] of m3) {
console.log(k)
console.log(v)
}
// 1
// a
// 2
// b
// 3
// c
2. forEach
map에도 arr처럼 forEach가 있다. 모든 요소를 순회하며 액션을 실행해준다.
forEach method의 인수는 두 개로, callback 함수와 thisArg.
후자는 지금은 몰라도 될 것 같고,
callback 함수는 각 요소에 대해 실행할 함수로,
다시 v, k, m 3개의 인수를 가진다. (전부 optional)
v, k는 각각 value, key고 m은 피연산자인 map 자체를 의미한다.
m3.forEach((v, k, m) => {
console.log(v, k, m)
})
// 출력값
// a 1 Map(3) { 1 => 'a', 2 => 'b', 3 => 'c' }
// b 2 Map(3) { 1 => 'a', 2 => 'b', 3 => 'c' }
// c 3 Map(3) { 1 => 'a', 2 => 'b', 3 => 'c' }
3. entries
map 객체를 [k, v]쌍을 가진 iterator obj로 만들어주는 method이다.
let iter = m3.entries()
console.log(iter) // [Map Entries] { [ 1, 'a' ], [ 2, 'b' ], [ 3, 'c' ] }
// 이렇게 만든 map entries인 iter는 순회 관련 함수를 사용할 수 있게 된다.
for (let [k, v] of iter) {
console.log(k, v)
}
// 1 a
// 2 b
// 3 c
4. keys(), values()
key, value 각각만을 모아 map iterator 생성
let keyIter = m3.Keys()
let valueIter = m3.values()
console.log(keyIter) // [Map Iterator] { 1, 2, 3 }
console.log(valueIter) // [Map Iterator] { 'a', 'b', 'c' }
'Algorithm' 카테고리의 다른 글
[nodejs] for (0) | 2023.08.22 |
---|---|
Study - Array vs. Map/Set (0) | 2023.08.17 |
Study - Set (0) | 2023.08.17 |
백준 10815 (nodejs) (0) | 2023.08.17 |
Intro (0) | 2023.08.17 |