[JS] Set, Map, Object 정리

장택진·2023년 4월 6일
0

javascript

목록 보기
1/1

프로그래머스에서 알고리즘문제를 풀고 난 뒤 다른 사람의 풀이를 보면
new Set과 Map 으로 간단하게 푸는 사람이 많아 공부 겸 정리를 해보려고 합니다.

Set

Set 객체는 자료형에 관계없이 원시 값과 객체 참조 모두 유일한 값을 저장할 수 있다.

더 자세히 알아보자면

  • Set은 중복을 허용하지 않는 데이터 집합
  • 중복을 확인하기 위해 자료형을 변형하지 않는다. 즉, 1과 '1'을 다른 것으로 판단한다.
  • forEach(callback(value,key,set)...), for of 로 접근 가능하다.

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

Map 객체는 키-값 쌍과 키의 원래 삽입 순서를 기억합니다. 모든 값(객체 및 원시 값 모두)은 키 또는 값으로 사용될 수 있습니다.

정리해서 알아보자면

  • Map 객체는 키-값을 저장한다.
  • Set과 마찬가지로 key는 자료형을 구분한다.
  • Set처럼 배열을 넣어서 초기화 시킬 수 도 있다. (forEach,for of 등 도 가능)

    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 vs Map

Object란?

Object 역시 Map과 같이 key-value로 저장한다.
object에서 key를 주로 property라고 부른다. object에서도 key는 unique하고 하나의 value와만 associated 돼 있다.

차이점을 보자면

  • Key Type
    • Object는 문자열,숫자,심볼 밖에 못들어간다.
    • Map은 모두 다 들어갈 수 있고 서로 구분이 된다 (array,object...)
  • Map은 데이터의 순서를 보존한다
profile
필요한 것은 노력과 선택과 치킨

0개의 댓글