[모던 JavaScript 튜토리얼] - [5.7] 맵 & 셋 (Map & Set)

IRISH·2024년 1월 31일
0

JS

목록 보기
55/80


학습 내용

은 키가 있는 값이 저장된 컬렉션입니다.

주요 메서드와 프로퍼티:

  • new Map([iterable]) – 맵을 만듭니다. [key,value]쌍이 있는 iterable(예: 배열)을 선택적으로 넘길 수 있는데, 이때 넘긴 이터러블 객체는 맵 초기화에 사용됩니다.
  • map.set(key, value) – 키를 이용해 값을 저장합니다.
  • map.get(key) – 키에 해당하는 값을 반환합니다. key가 존재하지 않으면 undefined를 반환합니다.
  • map.has(key) – 키가 있으면 true, 없으면 false를 반환합니다.
  • map.delete(key) – 키에 해당하는 값을 삭제합니다.
  • map.clear() – 맵 안의 모든 요소를 제거합니다.
  • map.size – 요소의 개수를 반환합니다.

일반적인 객체와의 차이점:

  • 키의 타입에 제약이 없습니다. 객체도 키가 될 수 있습니다.
  • size 프로퍼티 등의 유용한 메서드나 프로퍼티가 있습니다.

은 중복이 없는 값을 저장할 때 쓰이는 컬렉션입니다.

주요 메서드와 프로퍼티:

  • new Set([iterable]) – 셋을 만듭니다. iterable 객체를 선택적으로 전달받을 수 있는데(대개 배열을 전달받음), 이터러블 객체 안의 요소는 셋을 초기화하는데 쓰입니다.
  • set.add(value) – 값을 추가하고 셋 자신을 반환합니다. 셋 내에 이미 value가 있는 경우 아무런 작업을 하지 않습니다.
  • set.delete(value) – 값을 제거합니다. 호출 시점에 셋 내에 값이 있어서 제거에 성공하면 true, 아니면 false를 반환합니다.
  • set.has(value) – 셋 내에 값이 존재하면 true, 아니면 false를 반환합니다.
  • set.clear() – 셋을 비웁니다.
  • set.size – 셋에 몇 개의 값이 있는지 세줍니다.

과 에 반복 작업을 할 땐, 해당 컬렉션에 요소나 값을 추가한 순서대로 반복 작업이 수행됩니다. 따라서 이 두 컬렉션은 정렬이 되어있지 않다고 할 수 없습니다. 그렇지만 컬렉션 내 요소나 값을 재 정렬하거나 (배열에서 인덱스를 이용해 요소를 가져오는 것처럼) 숫자를 이용해 특정 요소나 값을 가지고 오는 것은 불가능합니다.


실습 코드

/* 
Map - 맵(Map)은 키가 있는 데이터를 저장한다는 점에서 객체와 유사합니다. 
다만, 맵은 키에 다양한 자료형을 허용한다는 점에서 차이가 있습니다. 
*/
let map = new Map();

map.set('1', 'str1');   // 문자형 키
map.set(1, 'num1');     // 숫자형 키
map.set(true, 'bool1'); // 불린형 키

// 객체는 키를 문자형으로 변환한다는 걸 기억하고 계신가요?
// 맵은 키의 타입을 변환시키지 않고 그대로 유지합니다. 따라서 아래의 코드는 출력되는 값이 다릅니다.
console.log( map.get(1)   ); // 'num1'
console.log( map.get('1') ); // 'str1'

console.log( map.size ); // 3

///////////////////////////////////////////////////////////////////////////
/* Object.entries: 객체를 맵으로 바꾸기 */
let obj = {
    name: "John",
    age: 30
  };
  
let map2 = new Map(Object.entries(obj));

console.log( map2.get('name') ); // John

///////////////////////////////////////////////////////////////////////////
/* 셋[Set] */
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);

// 셋에는 유일무이한 값만 저장됩니다.
console.log( set.size ); // 3

for (let user of set) {
  console.log(user.name); // // John, Pete, Mary 순으로 출력됩니다.
}

과제

→ 문제1

/*
arr은 배열이라 가정합시다.

arr에서 중복 값을 제거해 주는 함수 unique(arr)를 만들어보세요.
*/
function unique(arr) {
    // /* 제출 답안 */
    // let valSet = new Set(arr)

    // return valSet; // Set(3) { 'Hare', 'Krishna', ':-O' }

    return Array.from(new Set(arr));
}

let values = ["Hare", "Krishna", "Hare", "Krishna",
"Krishna", "Krishna", "Hare", "Hare", ":-O"
];

console.log( unique(values) ); // 얼럿창엔 `Hare, Krishna, :-O`만 출력되어야 합니다.

→ 문제2

/* 
애너그램(어구전철)은 단어나 문장을 구성하고 있는 문자의 순서를 바꾸어 다른 단어나 문장을 만드는 놀이입니다.

예시:

nap - pan
ear - are - era
cheaters - hectares - teachers
애너그램으로 만든 단어를 걸러내는 함수 aclean(arr)을 만들어보세요.

예시:

let arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];

console.log( aclean(arr) ); // "nap,teachers,ear"나 "PAN,cheaters,era"이 출력되어야 합니다.
*/

// 정답 1
function aclean1(arr) {
    let map = new Map();
  
    for (let word of arr) {
      // 단어를 글자 단위로 쪼갠 후, 알파벳 순으로 정렬한 다음에 다시 합칩니다.
      let sorted = word.toLowerCase().split('').sort().join(''); // (*)
      map.set(sorted, word);
    }
  
    return Array.from(map.values());
  }
  
let arr1 = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];

console.log( aclean1(arr1) ); // [ 'PAN', 'hectares', 'era' ]

//////////////////////////////////////////////////////////////////

// 정답 2
function aclean2(arr) {
    let obj = {};

    for (let i = 0; i < arr.length; i++) {
        let sorted = arr[i].toLowerCase().split("").sort().join("");
        obj[sorted] = arr[i];
    }

    return Object.values(obj);
}

let arr2 = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];

console.log( aclean2(arr2) ); // [ 'PAN', 'hectares', 'era' ]

느낀점

파이썬 코테 공부를 했을 때 맵과 셋 공부를 해놓았어서 어렵게 느껴지지는 않았다.

다만, 단순히 맵의 개념과 셋의 개념을 알려준 것이 아니라 객체와의 다른점을 비교해 알려준 것을 학습할 수 있어서 좋았다.

profile
#Software Engineer #IRISH

0개의 댓글