post-custom-banner

Map객체란?

Map객체는 [키와 값]으로 이루어진 요소들의 집합이다.

객체도 키와 값으로 이루어져 있는데,
그렇다면 Map객체와 일반 객체의 차이점은 무엇일까?

구분객체Map객체
키로 사용할 수 있는 값문자열 or 심벌 값키 타입에 제한 없음
(객체를 포함한 모든 값 가능)
이터러블인가xo

[ Map 객체의 생성 ]

  • 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객체 요소의 개수 ]

  • 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']
}

                    
profile
안녕하세요!
post-custom-banner

0개의 댓글