프로그래머스에서 알고리즘문제를 풀고 난 뒤 다른 사람의 풀이를 보면
new Set과 Map 으로 간단하게 푸는 사람이 많아 공부 겸 정리를 해보려고 합니다.
Set 객체는 자료형에 관계없이 원시 값과 객체 참조 모두 유일한 값을 저장할 수 있다.
더 자세히 알아보자면
new Set(iterable) – Set을 만듭니다. 이터러블 객체를 전달받으면(대개 배열을 전달받음) 그 안의 값을 복사해 Set에 넣어줍니다.
set.add(value) – 값을 추가하고 Set 자신을 반환합니다.
set.delete(value) – 값을 제거합니다. 호출 시점에 Set 내에 값이 있어서 제거에 성공하면 true, 아니면 false를 반환합니다.
set.has(value) – Set 내에 값이 존재하면 true, 아니면 false를 반환합니다.
set.clear() – Set을 비웁니다.
set.size – Set에 몇 개의 값이 있는지 세줍니다.
const mySet = new Set(); // {}
mySet.add(1); // {1}
mySet.add(2); //{1,2}
mySet.size; //2
mySet.delete(1); //{2}
mySet.has(2); //true
mySet.has(1); //false
myset.clear(); // {}
let arr = [...mySet]; //Spread 연산자를 이용해 array로 만들 수 있다.
//array중복제거 하고싶으면 Set바꿨다 arr 하면 쉽게 해결
function arrayDuplicates(item) {
return [...new Set(item)];
}
Map 객체는 키-값 쌍과 키의 원래 삽입 순서를 기억합니다. 모든 값(객체 및 원시 값 모두)은 키 또는 값으로 사용될 수 있습니다.
정리해서 알아보자면
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 – 요소의 개수를 반환합니다.
let myMap = new Map(); //{}
myMap.set(1, 'hello'); //{1=>'hello'}
myMap.set('1', 'hello'); //{1=>'hello', '1'=>'hello'}
myMap.set(1, 'world'); //{1=>'world', '1'=>'hello'}
myMap.get(1); //'world'
myMap.has(1); //true
myMap.delete(1); // {'1' => 'hello'}
//clear, size 는 Set과 같다.
let myMap = new Map(['name', 'jini'], ['city', 'JC']);
//{"name" => "jini", "city" => JC"}
Map을 좀 더 직관적으로 응용하면
map.has()로 키값을 검사하고, 없으면 map.set()을 통해 key와 value를 넣어줍니다.
그리고 map.get으로 key값을 가져와서 value에 넣거나 value에 있는 배열에 push해 줄 수 있습니다.
위 내용을 예시로 배열에 중복값이 있다면 value를 + 1 해주는 예시 코드입니다.
let temp = new Map();
for (let i = 0; i < s.length; i++) {
let item = s[i];
if (temp.has(item)) temp.set(item, temp.get(item) + 1);
else temp.set(item, 1);
}
let obj = {
name:'jini',
age:25
};
let myMap = new Map(Object.entries(obj));
// 객체를 2차원의 key:value 형태로 만들고 맵으로 변환
// [["name","jini"],["age",25]]
맵 -> 객체 는 반대로 Object.fromEntries 메서드를 사용하면 된다. 각 요소가 [키,값] 쌍인 배열을 객체로 바꿔줍니다.
참고 : https://ko.javascript.info/map-set
Object 역시 Map과 같이 key-value로 저장한다.
object에서 key를 주로 property라고 부른다. object에서도 key는 unique하고 하나의 value와만 associated 돼 있다.
차이점을 보자면