Map
은 키가 있는 데이터를 저장하기 대문에 객체
와 비슷하다.
하지만, Map
은 키에 다양한 자료형을 허용한다.
맵의 주요메서드와 프로퍼티를 알아보자
new Map()
-> 맵 자료형을 생성한다.map.set(key, value)
-> 해당 key
에 해당하는 value
를 저장한다.map.get(key)
-> 해당 key
에 해당하는 값을 반환하고, 존재하지 않으면 undefined
를 반환한다.map.has(key)
-> key
가 존재하면 true
, 없으면 false
를 반환한다.map.delete(key)
-> key
에 해당하는 값을 삭제한다.map.clear()
-> 맵 안의 모든 요소를 제거한다.map.size
-> 요소의 개수를 반환한다.let map = new Map(); map.set('500', 'str1'); // 문자형 key map.set(500, 'num1'); // 숫자형 key map.set(true, 'bool1'); // 불린형 key //객체는 키를 문자형으로 변환하지만 맵은 그 데이터타입을 유지한다.
맵을 사요할때는 객체처럼 사용하지 않는것이 좋다.
let obj = new Object(); obj['key'] = 'value'; // 객체는 대괄호 또는 점으로 키를 접근하고 생성하지만 // 맵은 `get`과 `set`메서드를 이용하는것이 옳다. let map = new Map(); map.set('hello', 'world'); map.get('hello'); // 'world'
맵 자료형이 키를 비교하는 방식
map
자료형은 SameValueZero라는 알고리즘을 사용해 값의 등가 여부를 확인합니다. 이 알고리즘은 일치 연산자와 거의 유사하지만,NaN
과NaN
을 같다고 취급한다.
따라서 맵에는NaN
도 키로 사용할 수 있다.
체이닝
map.set
을 호출할 때마다 맵 자신이 반환된다.
이를 이용하여map.set
을chaining
할 수 있다.map.set('1', 1) .set('2', 2) .set('3', 3);
map
의 반복작업을 할 수 있는 방법이 있다.
key
값들을 모은 이터러블 객체를 반환value
값들을 모은 이터러블을 반환key
, value
]을 한쌍으로 하는 이터러블 객체를 반환한다.let helloMap = new Map([ ['Korea', '안녕'], ['USA', 'hello'], ['China', '你好'], ]); for(let key of helloMap.keys()) { console.log(key); // 'korea', 'USA', 'China } for(let value of helloMap.values()) { console.log(value); // '안녕', 'hello', '你好' for(let entry of helloMap.entries()) { //helloMap만 넣어도 똑같이 실행된다. console.log(entry); // ['Korea', '안녕'], ['USA', 'hello'], ['China', '你好'] }
Map
은 삽입 순서를 기억한다.
Map
은 값이 삽입된 순서대로 순회를 한다.
Object
는 순서가 없다는 차이점이 존재한다.
배열내에 키와 밸류 쌍으로 이루어진 배열 또는 이터러블 객체를
Map
의 초기화 용도로 생성할 때 전당할 수 있다.
let map = new Map([ [1, '1'], [2, '2'], [3, '3'], ]); console.log(map.get(1)); // '1'
또한 객체
를 가지고 map
을 만들고 싶다면 Object.entries(obj)
를 활용하여 만들 수 있다.
이 메서드는 객체를 배열로 만들어 리턴하기 때문에
리턴된 배열을 맵의 초기값으로 설정할 수 있다.
let obj = { name: 'quakka', age: 29, }; let map = new Map(Object.entries(obj)); console.log(map.get('name')); // 'quakka'
반대로 map
데이터를 object
변환도 가능하다.
이 메서드는 각 요소가 [key, value]
쌍인 배열을 객체로 바꿔준다.
우선 아래는 배열
을 객체로 변경하는 방법이다.
let user = Object.fromEntries([ ['name', 'quakka'], ['age', 30], ]); console.log(user.name); // 'quakka'
위처럼 배열
을 객체로 변경하는것을 이용하여
맵
을 배열
로 변환하여 메서드에 전해줘보자.
let map = new map(); map.set(1, 1) .set(2, 2) .set(3, 3); let obj = Object.fromEntries(map.entries()); // map 데이터를 배열로 변환한 뒤 메서드의 인자로 전달해 객체로 변환시킨다. console.log(obj['1']); // 1
중복을 허용하지 않는 값을 모아놓은 특별한 컬렉션
셋에 키가 없는 값이 저장된다.
주요 메서드와 프로퍼티를 알아보자
set
을 생성한다.set
내에서 동일한 값이 있다면 set.add(value)
를 호출해도 반응이 없다.
아래의 예롤 보자
let 방명록 = new Set(); let quakka = { name: "quakka" }; let horse = { name: "horse" }; let hamster = { name: "hamster" }; 방명록.set(quakka); // quakka 방문 방명록.set(horse); // horse 방문 방명록.set(quakka); // quakka 재 방문 방명록.set(hamster); // hamster 방문 방명록.set(quakka); // quakka 재 방문 console.log(방명록.size); // 3 for(let 방문자 of 방명록) { console.log(방문자.name); // quakka, horse, hamster }
배열에서 요소가 존재한다면 데이터를 넣지않는 방식으로도 구현이 가능하지만 set
보다 성능이 떨어진다.
for..of
나 forEach
를 사용한다면 셋의 값을 대상으로 반복작업을 수행할 수 있다.
let set = new Set(['apple', 'orange', 'banana']); for(let el of set) { console.log(el); // apple, orange, banana } set.forEach((el, elAgain, set) => { console.log(el); // apple, orange, banana }
forEach
에 사용되는 콜백 함수는 세 개의 인수를 받고있는것을 볼 수 있다.
첫 번째는 값
, 두 번째도 같은 값
, 세 번째는 목표하는 (셋)이다.
이렇게 동일하게 두개를 받게 구현된 이유는 map
과의 호환성 때문이다. 맵
의 forEach
에 쓰인 콜백이 세 개의 인수를 받을 때를 위함이다. 구현 자체가 이렇기 때문에 set
과 map
은 서로 교체하기가 쉽다.
set
에도 반복작업을 위한 메서드가 있다.
set.keys()
-> 모든 값이 이터러블 객체로 변환되어 반환set.values()
-> set.keys()
와 동일함, 맵과의 호환때문에 만들어짐set.entries()
-> 각자의 값이 출력되는데 [value
, value
]로 출력이된다. 이또한 맵과의 호환성을 위해 만들어 졌다.