[Modern Javascript] Map, Set
본 내용은 모던 자바스크립트 맵과 셋을 보고 공부, 정리한 내용입니다.
맵 (Map)
자바스크립트의 Map은 key, value 형태로 데이터를 저장한다는 점에서 객체와 유사하지만, Map은 key 데이터형에 제약이 없다는 점에서 객체와 다르다.
객체는 key를 문자형으로 변환하여 저장하고, Map은 key 데이터형 그대로 저장한다.
1 |
|
위 예시에서 Map의 key들을 살펴보면 객체 자체가 key로 사용된 반면, 객체의 key들을 살펴보면 객체가 문자형으로 변환된 상태로 사용되었음을 알 수 있다.
Map 또한 Object를 상속하여 만들어졌으므로, 일반적인 객체처럼 데이터 삽입이 가능하다. 하지만 이는 권장되지 않는 방법이다. 일반적인 객체 방식으로 데이터를 관리하게 되면 Map 에서 제공하는 메서드들을 이용할 때 의도치 않은 결과를 낳을 수 있다.
1 |
|
Map과 객체의 차이를 조금 더 살펴보자면
- 객체는 key가 숫자형, 문자형, 심볼형 순으로 정렬되어 저장된다.
- Map은 데이터가 삽입된 순서를 유지한다.
1 |
|
위 코드를 보면 Map은 데이터 삽입 순서를 유지하고 있는 반면, 객체는 숫자형, 문자형, 심볼형 순으로 정렬되어있는 것을 볼 수 있다.
덧붙이자면, 객체는 숫자형의 경우 크기 순으로 정렬되고, 문자형의 경우 삽입된 순서를 유지한다.
1 |
|
자바스크립트의 Map이 내부적으로 어떤 자료구조를 사용하는지 궁금하여 열심히 구글링 해보았으나, 공식 문서에서는 해당 내용을 찾지 못했고 stackoverflow 질문글의 답변에서 실마리를 찾았다.
자바스크립트의 객체와 Map 모두 간단한 hash를 이용한 배열 구조로 이루어져 있고, 둘 간의 큰 차이는 없지만 hashMap과 같은 자료구조로 사용하기에 더 적합한 건 Map이라고 한다.
Map 요소에 반복 작업하기
Map에서 순회 가능한 객체를 반환받는 메서드는 아래와 같다.
-
Map.keys()
Map의 key들을 모은 이터러블 객체를 반환한다. -
Map.values()
Map의 value들을 모은 이터러블 객체를 반환한다. -
Map.entries()
Map의 key, value 쌍을 모은 이터러블 객체를 반환한다.
Map은 이터러블 객체이므로 forEach나 for..of문의 사용이 가능하다.
1 |
|
객체와 Map 사이 변환
객체 → Map
Map 생성 시 entries로 이루어진 배열을 인자로 넘겨주면, 해당 entries로 만들어진 Map을 얻을 수 있다.
1 |
|
만약 객체를 Map으로 바꾸고 싶다면, 객체의 key, value 쌍을 entry로 하는 배열을 반환해주는 Object.entries() 내장 메서드를 사용하여 할 수 있다.
1 |
|
Map → 객체
반대로 Map을 객체로 변환하고 싶다면 Object.fromEntries() 내장 메서드를 이용할 수 있다.
1 |
|
Object.fromEntries() 메서드는 인자가 이터러블 객체이면 된다. 즉, 반드시 배열이 아니어도 된다.
1 |
|
셋 (Set)
Set은 중복을 허용하지 않는 value들을 저장하는 자료구조이다.
Set의 주요 메서드는 아래와 같다.
1 |
|
Set은 중복이 있을 수 없는 자료구조이므로, 중복을 제거할 필요가 있거나 단 한 번만 기록해야하는 작업에 유용하다.
Set도 이터러블 객체이다. 즉, forEach나 for..of문의 사용이 가능하다.
1 |
|
Set의 forEach문을 살펴보면, key를 사용하지 않기 때문에 인자로 value를 두 번 받는다. 비효율적으로 보이지만 Map과의 호환성을 맞추기 위해 이렇게 설정되었고, 이 덕분에 Map → Set, Set → Map 간의 변환이 자유롭다.
Map과의 호환성을 위해 Map에서 지원했던 내장 메서드들도 동일하게 지원한다.
-
Set.keys()
Set 안의 모든 값을 포함하는 이터러블 객체를 반환한다. -
Set.values()
Set.keys()와 동일한 작업을 한다. -
Set.entries()
[value, value] entries를 갖는 이터러블 객체를 반환한다.