TIL*
0622: Map, Set
mnmhbbb
2021. 6. 21. 23:27
커뮤니티에서 발견한 어떤 코드를 공부하다가 맵, 셋에 대한 지식이 부족함을 느껴서 다시 정리하려고 한다.
const arr = [
{ apple: 10 },
{ banana: 25 },
{ banana: 10 },
{ melon: 20 },
{ apple: 10 },
{ melon: 20 },
];
function accumulate(arr) {
const map = new Map();
arr.forEach((v) => {
const [[key, value]] = Object.entries(v);
if (map.has(key)) {
map.set(key, map.get(key) + value);
} else {
map.set(key, value);
}
});
return console.log(map);
}
accumulate(arr);
// {"apple" => 20, "banana" => 35, "melon" => 40}
객체: key가 있는 컬렉션을 저장
배열: 순서가 있는 컬렉션을 저장
그런데 이 2가지 자료구조만으로 부족함이 있어서 Map과 Set이 등장함
맵 Map
객체처럼 key가 있는 데이터를 저장하지만, 객체와 달리 key에 다양한 자료형을 허용한다.
또한, 객체와 달리 프로퍼티 순서를 기억한다.
맵의 주요 메서드와 프로퍼티
- 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 – 요소의 개수를 반환합니다.
맵의 요소에 반복 작업하기. 순회!
- map.keys() – 각 요소의 키를 모은 반복 가능한(iterable, 이터러블) 객체를 반환합니다.
- map.values() – 각 요소의 값을 모은 이터러블 객체를 반환합니다.
- map.entries() – 요소의 [키, 값]을 한 쌍으로 하는 이터러블 객체를 반환합니다. 이 이터러블 객체는 for..of반복문의 기초로 쓰입니다.
+) keys(), values(), entries()를 사용할 수 있는 자료구조는 다음과 같습니다.
- Map
- Set
- Array
일반 객체에서 위 메서드를 사용하면 다음과 같은 결과를 반환한다.
- Object.keys(obj) – 객체의 키만 담은 배열을 반환합니다.
- Object.values(obj) – 객체의 값만 담은 배열을 반환합니다.
- Object.entries(obj) – [키, 값] 쌍을 담은 배열을 반환합니다.
Object.메서드(obj) = 배열
예시)
let user = {
name: "John",
age: 30
};
- Object.keys(user) = ["name", "age"]
- Object.values(user) = ["John", 30]
- Object.entries(user) = [ ["name","John"], ["age",30] ]
+) Object.fromEntries(obj) 를 사용하면 배열을 객체로 변환
const arr = [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ];
const obj = Object.fromEntries(arr);
console.log(obj); // { 0: "a", 1: "b", 2: "c" }
셋 Set
중복을 허용하지 않는 값들을 모아놓은 특별한 컬렉션
배열과 비슷하지만 차이점은 중복을 허용하지 않는다는 것이다.
셋의 주요메서드
- new Set(iterable) – 셋을 만듭니다. 이터러블 객체를 전달받으면(대개 배열을 전달받음) 그 안의 값을 복사해 셋에 넣어줍니다.
- set.add(value) – 값을 추가하고 셋 자신을 반환합니다.
- set.delete(value) – 값을 제거합니다. 호출 시점에 셋 내에 값이 있어서 제거에 성공하면 true, 아니면 false를 반환합니다.
- set.has(value) – 셋 내에 값이 존재하면 true, 아니면 false를 반환합니다.
- set.clear() – 셋을 비웁니다.
- set.size – 셋에 몇 개의 값이 있는지 세줍니다.
* 중복을 허용하지 않기 때문에
셋 내에 동일한 값(value)이 있다면 set.add(value)을 아무리 많이 호출하더라도 아무런 반응이 없다.
출처: https://ko.javascript.info/map-set, https://ko.javascript.info/keys-values-entries