10.1 맵 (Map)

객체의 단점

  • 프로토타입 체인 때문에 의도하지 않은 연결이 생길 수 있음

  • 객체 안에 연결된 키와 값이 몇 개나 되는지 쉽게 알아낼 수 있는 방법이 없음

  • 키는 반드시 문자열이나 심볼이어야 하므로 객체를 키로 써서 값과 연결할 수 없음

  • 객체는 프로퍼티 순서를 전혀 보장하지 않음

  • 객체의 결함을 모두 해결했음

  • 키와 값을 연결할 목적이라면 맵이 객체보다 더 나음

// 사용자 객체에 역할 부여
  const u1 = { name: 'Cynthia' };
  const u2 = { name: 'Jackson' };
  const u3 = { name: 'Olive' };
  const u4 = { name: 'James' };

  // 방법 1
  // 맵 생성
  const userRoles = new Map();

  // 사용자 역할 할당
  userRoles.set(u1, 'User');
  userRoles.set(u2, 'User');
  userRoles.set(u3, 'Admin');

  // set() 메서드는 체인으로도 가능
  userRoles
    .set(u1, 'User')
    .set(u2, 'User')
    .set(u3, 'Admin');

  // 방법 2
  // 생성자에 배열의 배열을 넘기는 형태로도 가능
  const userRoles2 = new Map([
    [u1, 'User'],
    [u2, 'User'],
    [u3, 'Admin'],
  ]);

get() 메서드

  • 맵에 존재하는 키의 값을 호출할 때 사용

  • 맵에 존재하지 않는 키에 get을 호출하면 undefined 반환

    • 맵에 키가 존재하는지 확인하려면? has() 메서드 사용

userRoles.get(u2); // "User"

set() 메서드

  • 이미 존재하는 키에 set()을 호출하면 값을 변환할 수 있음

  userRoles.get(u1);
  console.log("before : " + userRoles.get(u1));

  userRoles.set(u1, 'Admin');
  console.log("after : " + userRoles.get(u1));

결과

before : User
after : Admin

size 프로퍼티

  • 맵의 요소 숫자를 반환

userRoles.size; // 3

keys() 메서드

  • 맵의 키 반환

values() 메서드

  • 값을 반환

entries() 메서드

  • 첫 번째 요소가 키이고 두 번째 요소가 값인 배열을 반환

  for (let u of userRoles.keys())
    console.log(u.name);

  for (let r of userRoles.values())
    console.log(r);

  for(let [u, r] of userRoles.entries())
    console.log(`${u.name}: ${r}`);

// 위의 entries() 사용한 코드를 단축해서 아래처럼 쓸 수 있음
  for (let [u, r] of userRoles)
    console.log(`${u.name}: ${r}`);

delete() 메서드

  • 맵의 요소를 지울 때 사용

clear() 메서드

  • 맵의 모든 요소를 지울 때 사용

Last updated