Javascript
ES6 에서 추가된 문법들(2) - Map
joy_lee
2024. 7. 10. 01:06
es6 에 새롭게 추가된 Map 객체에 대해 알아보자.
Map
map 객체는 키-값 쌍의 집합이다.
키는 단 하나만 존재할 수 있다. Object 는 key는 string 또는 symbol 만 사용할 수 있지만 Map 은 모든 값(함수, 객체 또는 원시값 등)을 사용할 수 있다.
Object 와 비슷하지만 다른점이 많다.
Object vs Map
Object | Map | |
항목의 순서 | 입력한 대로 정렬되는 편이지만 항상 그런 것은 아님. 순서가 없다고 생각하는 편이 안전함. | 입력한 순서대로 정렬됨 |
키 유형 | string 혹은 symbol (number 형식으로 key 를 생성하면 자동으로 string으로 변환된다.) |
모든 값이 가능함 (함수, 객체 또는 함수 등) |
크기 | 수동으로 결정해야함 | Map.size |
순회 | Object.keys, Object.entries 혹은 for…of, for…in 을 사용해야함 | Object 의 순회 방법도 가능하며, forEach로도 순회가능순회가능 |
Map의 Methods
- Map 생성하기 - new Map()
- Map 의 값 설정하기 - Map.prototype.set()
// Map 최초 생성
const myMap = new Map();
// 데이터 입력
myMap.set(1, 'one'); // set(key, value) 로 입력한다
myMap.set(2, 'two');
console.log(myMap);
// new Map([ [ 1, "one" ], [ 2, "two" ], ])
Map 의 값 찾기
- Map.prototype.get() - 입력한 키에 해당하는 값을 반환, 없으면 undefined
- Map.protoType.has() - 입력한 키에 연관된 값이 Map 에 존재하는지 여부를 boolean으로 반환
// get() -> 키에 해당하는 값 반환
console.log(myMap.get(1)); // 'one'
// value 로는 찾을 수 없다
console.log(myMap.get('one')); // undefined
// has() -> 입력한 키가 존재하는지 확인
console.log(myMap.has(2)); // true
// value 가 존재하는지는 찾을 수 없다
console.log(myMap.has('two')); // false
Map 의 순환
- Map.keys() - 키를 포함한 반복자 반환
- Map.values() - 값들을 포함한 반복자 반환
// keys
const keyIterator = myMap.keys();
console.log(keyIterator.next().value); // 1
console.log(keyIterator.next().value); // 2
// values
const valueIterator = myMap.values();
console.log(valueIterator.next().value); // 'one'
console.log(valueIterator.next().value); // 'two'
- Map.prototype.entries() - [key, value]를 삽입한 순서대로 반복자 반환
- Map.prototype[@@iterator] - [key, value]를 삽입한 순서대로 반복자 반환
const mapIterator = myMap.entries();
console.log(mapIterator.next().value); // [1, 'one']
console.log(mapIterator.next().value); // [2, 'two']
// entries() 와 동일한 반복자를 반환한다
const mapIterator2 = myMap[Symbol.iterator]();
console.log(mapIterator2.next().value); // [1, 'one']
console.log(mapIterator2.next().value); // [2, 'two']
반복자들은 for…of 반복문에 사용된다.
const numberMap = new Map();
numberMap.set(1, 'one');
numberMap.set(2, 'two');
numberMap.set(3, 'three');
// 키를 대상으로 순회
for (let number of numberMap.keys()) {
alert(number); // 1, 2, 3
}
// 값을 대상으로 순회
for (let amount of numberMap.values()) {
alert(amount); // one, two, three
}
// [키, 값] 쌍을 대상으로 순회
for (let entry of numberMap) {
alert(entry); // 1,one ...
}
Map의 데이터 삭제
- Map.prototype.delete() - key를 입력해 해당 [ key, value ] 를 삭제
- Map.prototype.clear() - Map 의 모든 [ key, value ] 를 삭제
const numberMap = new Map();
numberMap.set(1, 'one');
numberMap.set(2, 'two');
numberMap.set(3, 'three');
// delete()
numberMap.delete(2);
console.log(numberMap);
// new Map([ [ 1, "one" ], [ 3, "three" ], ])
// clear()
numberMap.clear();
console.log(numberMap);
// new Map()
Map 의 크기
Map.prototype.size 로 쉽게 크기를 구할 수 있다.
const numberMap = new Map();
numberMap.set(1, 'one');
numberMap.set(2, 'two');
numberMap.set(3, 'three');
// size
console.log(numberMap.size); // 3
// Object와 비교
const numberObj = { 1: 'one', 2: 'two', 3: 'three' };
console.log(numberObj.size); // undefined
// 키가 몇 개 있는지 확인해야 한다.
const objKeys = Object.keys(numberObj);
console.log(objKeys.length); // 3