맵과 셋
- 객체 : 키가 있는 컬렉션을 저장함
- 배열 : 순서가 있는 컬렉션을 저장함
위의 두 자료구조만으론 부족해 맵과 셋이 등장하게 되었습니다
맵
맵은 키가 있는 데이터를 저장한다는 점에서 객체와 유사합니다.
하지만 맵은 키에 다양한 자료형을 허용한다는 점에서 차이가 있습니다.
예시
맵은 객체와 달리 키를 문자형으로 변환하지 않습니다. 키엔 자료형 제약이 없습니다
맵의 메서드와 프로퍼티
- new Map()
- 맵을 만듭니다.
- map.set(key, value)
- key를 이용해 value를 저장합니다.
- map.get(key)
- key에 해당하는 값을 반환합니다. key가 존재하지 않으면 undefined를 반환합니다.
- map.has(key)
- key가 존재하면 true, 존재하지 않으면 false를 반환합니다.
- map.delete(key)
- key에 해당하는 값을 삭제합니다.
- map.clear()
- 맵 안의 모든 요소를 제거합니다.
- map.size
- 요소의 개수를 반환합니다.
셋
셋은 중복을 허용하지 않는 값을 모아놓은 특별한 컬렉션입니다. 셋에 키가 없는 값이 저장됩니다.
셋의 메서드
- new Set(iterable)
- 셋을 만듭니다. 이터러블 객체를 전달받으면(대개 배열을 전달받음) 그 안의 값을 복사해 셋에 넣어줍니다.
- set.add(value)
- 값을 추가하고 셋 자신을 반환합니다.
- set.delete(value)
- 값을 제거합니다. 호출 시점에 셋 내에 값이 있어서 제거에 성공하면 true, 아니면 false를 반환합니다.
- set.has(value)
- 셋 내에 값이 존재하면 true, 아니면 false를 반환합니다.
- set.clear()
- 셋을 비웁니다.
- set.size
- 셋에 몇 개의 값이 있는지 세줍니다.
예시
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
// 어떤 고객(john, mary)은 여러 번 방문할 수 있습니다.
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);
// 셋에는 유일무이한 값만 저장됩니다.
alert( set.size ); // 3
for (let user of set) {
alert(user.name); // // John, Pete, Mary 순으로 출력됩니다.
}
맵과 셋에 반복 작업을 할땐 해당 컬렉션에 요소 나 값을 추가한 순서대로 반복 작업이 수행됩니다.
따라서 이 두 컬렉션은 정렬이 되어있지 않다고 할 수 없습니다.
하지만 컬렉션 내 요소나 값을 재 정렬하거나 숫자를 이용해 특정 요소나 값을 가지고 오는 것은 불가능합니다.