잡소리, 서론
코딩테스트 응시언어가 js로 제한되어있는 곳에 지원했다.
자바스크립트와 친숙했던 나지만 자바스크립트로 알고리즘 문제들을 풀어본 적이 없어서 이것저것 찾아보면서 공부하고 있다.
Map이라는 자료구조가 있는 줄 모르고 객체에 삽입/삭제하면서 삽질했던 나를 반성하며 포스트를 작성한다.
Map
Key-Value
자바스크립트의 Map
은 key-value 쌍으로 이루어져 있는 자료구조이다.
key 값에 아무거나 다 넣을 수 있다. 심지어 함수도 넣을 수 있다.
const testmap = new Map();
testmap.set(1,123);
testmap.set(2,345);
testmap.set(3,789);
const funcRef = () => {};
testmap.set(funcRef, 'function can be key.');
console.log(testmap.get(funcRef)); // 'function can be key'
console.log(testmap.get(() => {})); // undefined
for (let [key, val] of testmap.entries()) {
console.log(key, ':', val); // 1:123, 2:345, 3: 789
}
funcRef
와 () => {}
는 내용은 같지만 참조하는 레퍼런스가 다르기 때문에 함수를 키 값으로 지정해주었다면 위와 같은 방식으로 키를 참조해야한다.
Iteration
Map을 순회할 때에는 for ... of
혹은 forEach
구문을 사용하면 된다.
for (let [key, val] of testmap.entries()) {
console.log(key, ':', val); // 1:123, 2:345, 3: 789
}
for (let [key, val] of testmap) {
console.log(key, ':', val);
}
testmap.forEach((val, key) => {
console.log(key, ':', val);
})
forEach 구문을 사용할 때에는 key와 value의 순서가 반대라는 것만 기억하면 되겠다.
Sort
sort는 Array
객체의 프로로타입에 정의되어 있는 함수이다.
이 sort를 Map에서 사용하기 위해 Map과 Array의 관계에 대해 살펴보자.
Map의 생성자는 iterable
한 즉, 반복가능한 요소들에 대해서만 인자로 허용된다.
Map, Array, String 모두 iterable한 요소이다.
const testArray = [[1, 123], [2, 345], [3, 789]];
const arrayToMap = new Map(testArray);
for (let [key, val] of arrayToMap) {
console.log(key, ':', val);
}
즉, 다음과 같이 2차원 배열에 대해서 Map으로 변환이 가능하다. 물론 이 반대도 가능하다.
const mapToArray = [...arrayToMap];
const mapToArray_2 = Array.from(arrayToMap);
for (const [key, val] of mapToArray) {
console.log(key, ':', val);
}
for (const [key, val] of mapToArray_2) {
console.log(key, ':', val);
}
mapToArray
와 mapToArray_2
모두 같은 요소를 갖는다.
이렇게 Map을 Array로 변환 시킨 뒤 sort를 하면 되겠다.
mapToArray.sort((a, b) => b[1] - a[1]); // value값 기준 내림차순정렬
mapToArray.sort((a, b) => b[0] - a[0]); // key값 기준 내림차순정렬
mapToArray.sort((a, b) => a[1] - b[1]); // value값 기준 오름차순정렬
mapToArray.sort((a, b) => a[0] - b[0]); // key값 기준 오름차순정렬
필요에 의해 다시 Map으로 변환시켜도 된다.
const sortedMap = new Map(mapToArray.sort((a, b) => b[1] - a[1]));
'유연해지기 > Javascript' 카테고리의 다른 글
JavaScript Set 내 맘대로 구현하기 (1) | 2022.11.30 |
---|---|
Vanilla Javascript로 간단한 SPA 라우터 구현해보기 (4) | 2022.05.13 |
[Javascript] Iterable, 반복자 그리고 생성자 함수에 대하여 (0) | 2021.09.27 |
[Javascript] Promise 예제 풀어보기 (0) | 2021.09.12 |