맵
은 키가 있는 값이 저장된 컬렉션입니다.
주요 메서드와 프로퍼티:
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' ]
파이썬 코테 공부를 했을 때 맵과 셋 공부를 해놓았어서 어렵게 느껴지지는 않았다.
다만, 단순히 맵의 개념과 셋의 개념을 알려준 것이 아니라 객체와의 다른점을 비교해 알려준 것을 학습할 수 있어서 좋았다.