JavaScript 에서 HashTable은 대표적으로 객체(Object), Map, Set이 있습니다.
그런데 코드를 짜다보면 Key-Value 형태로 이루어진 자료구조는 객체(Object)가 대표적이었지만, ES6에 들어서서는 Map과 Set이 추가되었습니다.
Map 객체
Map 객체는 Key-Value 쌍과 Key의 원래 삽입 순서를 기억합니다. 모든 값은 키 또는 값으로 사용될 수 있습니다.
JavaScript에서의 Map은 java의 HashMap, python의 Dictionary와 같은 자료구조입니다.
Map 생성
let map = new Map();
위와 같이 생성자를 통해서 Map객체를 생성할 수 있습니다.
Map 크기
const map1 = new Map();
map1.set('a', 'alpha');
map1.set('b', 'beta');
map1.set('g', 'gamma');
console.log(map1.size); // 결과 : 3
size 구하기
객체(Object)의 경우 Size를 사용할 수 없습니다.
하지만 Object Map은 size() 함수를 사용하면 size를 구할 수 있습니다.
const map1 = new Map();
map1.set('bar', 'baz');
map1.set(1, 'foo');
console.log(map1.size); // 결과 : 2
모든 key-value 삭제
const map1 = new Map();
map1.clear();
console.log(map1.size); // 결과 : 0
Key로 Vaule 구하기
map.get(key)
특정 Key가 있는 지 확인
map.has(key)
Map에 추가
const map1 = new Map();
map1.set('bar', 'foo');
console.log(map1.has('bar')); // 결과 : true
console.log(map1.has('baz')); // 결과 : false
특정 Key가 있는 지 확인
const map1 = new Map();
map1.set('0', 'foo');
map1.set(1, 'bar');
const iterator1 = map1.entries();
console.log(iterator1.next().value); // 결과 : Array ["0", "foo"]
console.log(iterator1.next().value); // 결과 : Array [1, "bar"]
Map의 장점
다양한 형태 👌
JavaScript의 객체(Object)는 문자(String) 또는 Symbol(기호)만 가질 수 있었습니다.
그러나 Object Map은 다양한 형태를 가질 수 있습니다.
const map = new Map();
const func = () => console.log('Hello Object Map');
const str = 'Object Map';
const num = 123;
const obj = {
name: 'Park',
age: 28
};
map.set(func, 'function as a key');
map.set(num, 'number as a key');
map.set(obj, 'object as a key');
console.log(map.get(myFunction)); // function as a key
console.log(map.get(myNumber)); // number as a key
console.log(map.get(myObject)); // object as a key
console.log(map)
// Map(3) {ƒ => 'function as a key', 123 => 'number as a key', {…} => 'object as a key'}
좋은 성능
key,value의 형태로 저장되며 모든 데이터가 유일한 key를 가지고 있으므로 특정한 값을 아주 빠르게 찾을 수 있다는 특징을 가지고 있습니다.
해시가 특정한 값(데이터)를 아주 빠르게 찾을 수 있는 이유는 데이터를 검색할 때 사용할 key와 value가 1:1 매칭으로 존재하기 때문에 O(1)의 시간복잡도를 가지기 때문입니다.
다양한 형태의 반복문 사용
let map = new Map([
['name', Park],
['age', 28],
['sex', 'M']
]);
// key를 대상으로 순회.
for (let key of map.keys()) {
console.log(key); // name, age, sex
}
// value을 대상으로 순회.
for (let value of map.values()) {
console.log(value); // Park, 28, M
}
// [key, vaule] 쌍을 대상으로 순회.
for (let [key, value] of map) {
console.log(key + "," + value);
}
순서의 보장
const arr = [{key:3, value:'test1'},{key:1, value:'test2'},{key:2, value:'test3'}]
const obj = {}
arr.forEach(data => {
obj[data.key] = data.value
})
console.log(obj) // 결과 {1: 'test2', 2: 'test3', 3: 'test1'}
위 코드를 보면 객체의 key를 숫자로 지정했습니다. 그리고 forEach()를 사용하여 객체를 순회하면 삽입할 때 와는 다른 순서가 출력되는 것을 볼 수 있습니다.
const map = new Map();
map.set(3, 'test1')
map.set(1, 'test2')
map.set(2, 'test3')
for(const v of map){
console.log(v)
}
/*
[3, 'test1']
[1, 'test2']
[2, 'test3']
*/
그러나 Object Map에서는 원래의 삽입 순서를 기억할 수 있습니다.
'Language > JavaScript' 카테고리의 다른 글
[JavaScript] 숫자가 정수인지 판별하기 isInteger() (0) | 2024.04.25 |
---|---|
[JavaScript] charCodeAt(), fromCharCode() 알아보기 (0) | 2024.03.26 |
[JavaScript] 문자열을 숫자 배열로 쉽게 변환하기 map(Number) (0) | 2024.03.17 |
[JavaScript] match() 메서드 알아보기 (0) | 2024.02.21 |
[JavaScript] repeat() 메서드 알아보기 (0) | 2024.02.19 |