Map객체는 [키와 값]으로 이루어진 요소들의 집합이다.
객체도 키와 값으로 이루어져 있는데,
그렇다면 Map객체와 일반 객체의 차이점은 무엇일까?
구분 | 객체 | Map객체 |
---|---|---|
키로 사용할 수 있는 값 | 문자열 or 심벌 값 | 키 타입에 제한 없음 (객체를 포함한 모든 값 가능) |
이터러블인가 | x | o |
- Map 생성자 함수로 생성.
- 인수로는 이터러블 객체를 넣어주며, 인수를 전달하지 않으면 빈 Map객체가 생성됨
- 인수로 전달되는 값은 키와 값의 쌍으로 이루어진 요소로 구성되어야 한다.
// Map객체 생성
const map = new Map();
console.log(map) // Map(0) {}
// 인수로 전달되는 배열의 요소들이 키와 값으로 구성되어져 있다.
const map1 = new Map([['키1', '값1'], ['키2', '값2']]);
console.log(map1); // Map(2) {"키1" => "값1", "키2" => "값2"};
const map2 = new Map(['사과', '바나나'])
// Uncaught TypeError: Iterator value 1 is not an entry object
// 인수로 전달되는 배열의 요소들이 키와 값으로 구성되어 있지 않고,
// 단순히 '사과', '바나나'라는 값으로만 구성되어져 있기 때문에 TypeError가 발생하였다.
❗ Map 객체에는 중복된 키를 갖는 요소가 존재할 수 없다.
- 그런데도 불구하고 키 값이 중복되는 요소를 넣는다면?
중복된 키를 갖는 요소가 존재하면 값이 덮어씌워진다.
const map = new Map([['키1', '값1'], ['키1', '값2']]);
console.log(map); // Map(1) {"키1" => "값2"};
- Map.size: Map객체의 요소가 몇 개인지 확인할 때 사용
- size 메서드를 이용하여 Map객체의 크기 변경 불가능
const map = new Map([['키1', '값1'], ['키2' '값2']]);
map.size = 10; // (x) 잘못된 방법! 변경 불가능!
console.log(map.size); // 2
- 요소 추가
: Map객체.set(추가할 요소)
- 요소 삭제
: Map객체.delete(삭제할 요소)
→ delete 메서드는 삭제 성공시에는 true를, 실패시에는 false를 반환함
- 요소 일괄 삭제
: Map객체.clear()
const map = new Map();
// 요소 추가
map.set('사과', 'red');
console.log(map); // Map(1) {"사과" => "red"}
map.set('바나나', 'yellow');
map.set('귤', 'orange');
console.log(map); // Map(3) {"사과" => "red", "바나나" => "yellow", "귤" => "orange"}
// 중복된 키를 갖는 요소를 추가하면 값이 덮어써진다.
map.set('사과', 'green');
console.log(map); // Map(3) {"사과" => "green", "바나나" => "yellow", "귤" => "orange"}
// 요소 삭제
map.delete(사과);
console.log(map); // Map(2) {"바나나" => "yellow", "귤" => "orange"}
// 요소 일괄 삭제
map.clear();
console.log(map); // Map(0) {}
Map객체.has(요소의 key)
const map = new Map();
const lee = { name : 'Lee' };
// Map은 객체도 키로 사용할 수 있다.
map.set(lee, '개발자');
console.log(map); // Map(1) { {name : "Lee"} => "개발자" }
// lee라는 키를 가진 요소가 존재하는지 확인
console.log(map.has(lee)); // true
console.log(map.has('kim')); // false
Map객체.get(요소의 key) : 해당 키를 갖는 요소가 있으면 그 요소의 값을 반환
- 인수로 전달한 키를 갖는 요소가 없으면 undefined를 반환
const map = new Map([['사과', '빨갛다'], ['바나나', '노랗다']]);
// 요소값 획득
console.log(map.get('사과')); // 빨갛다
console.log(map.get('메론')); // undefined
- forEach((v, k, map) => { })
(1) 첫 번째 인수: 현재 순회중인 요소 값
(2) 두 번째 인수: 현재 순회중인 요소의 키
(3) 세 번째 인수: 현재 순회중인 Map객체 자신
- for ... of문
const 강아지 = { name : '초코' };
const 고양이 = { name : '나비' };
const map = new Map([[강아지, 'cute'], [고양이, 'pretty']]);
map.forEach((v, k, map) => console.log(v, k , map));
/* 요소값 , 요소키 , map객체
cute {name: "초코"}
Map(2) {
{name: "초코"}: "cute"
{name: "나비"}: "pretty"
}
pretty {name: "나비"}
Map(2) {
{name: "초코"}: "cute"
{name: "나비"}: "pretty"
}
*/
for (const key of map.keys()) {
console.log(key); // {name: "초코"} {name: "나비"}
}
for (const value of map.values()) {
console.log(value); // cute pretty
}
for (const entry of map.entries()) {
console.log(entry); // [{name: '초코'}, 'cute'] [{name: '나비'}, 'pretty']
}