코쿼 CS10 미션을 진행하며 복잡한 코드를 간단하게 바꿔주는 ES6 개념들을 알게 되었는데, 그 중에 하나가 Set
과 Map
이다. Set
과 Map
은 열, 객체를 유니크 한 값을 가진 컬렉션으로 만들고 싶을 때 아주 유용하게 사용할 수 있는 개념이다.
📍 Array : 순서가 있는 컬렉션을 저장 (Key 없음) //Set, WeakSet
📍 Object : key가 있는 컬렉션을 저장 (순서 없음) //Map,WeakMap
Set
은 중복을 허용하지 않는 value들이 key 없이 저장된다.
Set
은 value들로 이루어진 집합.Set
은 index가 없기 때문에 index로 value 접근 불가 let mySet = new Set();
mySet.add("A");
mySet.add("B");
mySet.add("A");
console.log("mySet")//"A" "B"
Map
은 key가 있는 value을 저장하고 iterable하다는 점에서 객체와 유사함.Map
은 객체와 달리 객체 자체를 key로 사용할 수 있음.Map
은 값이 삽입된 순서대로 순회한다. Map
은 객체가 property 순서를 기억하지 못하는 것과 달리 값의 삽입 순서를 기억함.let john = { name: "John" };
let visitsCountObj = {};
visitsCountObj[john] = 123;
// 원하는 값(123)을 얻으려면 아래와 같이 키가 들어갈 자리에 `object Object`를 써줘야합니다.
alert( visitsCountObj["[object Object]"] ); // 123
Map
은 Key가 있는 컬렉션이지만, 객체처럼map[key]
로 value에 접근하면 안 된다.
map[key] = 2
로 값을 설정할 수 있으나 이 방법은Map
을 일반 객체처럼 취급하게 되기 때문에 여러 제약이 생기게 된다. 따라서Map
을 사용할 땐Map
전용 메서드set
,get
등을 사용해야 한다.
차이 | Set | Map |
---|---|---|
유사 형태 | Array | Object |
길이 확인 | set.size | map.size |
중복 허용 | X | X |
순서 | O | O |
구성 | value | [key,value] |
iterable | O | O |
new Map()
: 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 안의 모든 요소를 삭제한다.map.size
: 요소의 개수를 반환한다.new Set(iterable)
: Set을 만든다.set.add(value)
: 값을 추가하고 Set 자신을 반환한다.set.delete(value)
: 값을 제거합니다. 호출 시점에 Set 내에 값이 있어서 제거에 성공하면 true, 아니면 false를 반환한다.set.has(value)
: Set 내에 값이 존재하면 true, 아니면 false를 반환한다.set.clear()
: Set 안의 모든 요소를 삭제한다.set.size
: 요소의 개수를 반환한다.Set/Map.keys()
: 모든 요소를 포함하는 iterable Object를 반환한다.Set/Map.values()
: 각 요소의 value를 모은 iterable Object를 반환한다.Set/Map.entries()
: 요소의 [key, value]을 한 쌍으로 하는 iterable Object를 반환한다.(for..of 반복문의 기초로 쓰임)let set = new Set(["oranges", "apples", "bananas"]);
for (let value of set) console.log(value);
//위 아래는 동일하게 작동
set.forEach((value, valueAgain, set) => {
console.log(value);
});
//set.forEach에서 value를 두 번 받는 것은 map과의 호환성을 위함
let arr = [1,2,3,4];
let arr2 = [5,6,7,8];
let obj = {arr, arr2};
let weakSet = new WeakSet();
weakSet.add(arr);
weakSet.add(arr2);
weakSet.add(obj);
arr = null;
console.log(weakSet); // WeakSet {Array(4), Array(4), {…}}
console.log(weakSet.has(arr), weakSet.has(arr2)); //false true
참고