Leetcode 문제를 풀면서 Map을 처음으로 써봤다.
Two Sum, Hash Map | Leetcode [자바스크립트]
알고리즘과 자료구조를 공부하기 시작했다. 기존엔 알고리즘 문제를 풀 때 배운 언어를 적용하고 메소드들을 학습하는 데 치중했다면 앞으로는 알고리즘 기법이나 자료구조 등을 생각하면서 ��
fennecfox-dev.tistory.com
function twoSum(nums, target) {
const container = new Map;
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i];
if (container.has(complement)) return [container.get(complement), i];
container.set(nums[i], i);
}
}
new를 사용해서 새 Map을 만든다.
Map.prototype.set()으로 키 밸류를 지정해준다. map.set(key, value) 이런 식으로.
Map.prototype.has()로 Map에 키가 있는지 확인할 수 있고
Map.prototype.get()으로 해당 키의 밸류를 불러올 수 있다.
문법이 상당히 쉽다.
궁금한 건 Object와 다른 점은 무엇인지, 언제 Map을 쓰고 언제 Object를 쓰는지다. 그래서 대략 조사를 했다.
Map
The Map object holds key-value pairs and remembers the original insertion order of the keys.
developer.mozilla.org
MDN 문서를 살펴보면 Map과 Object의 공통점과 차이점을 처음부터 발견할 수 있다.
Map과 Object 모두 키-밸류를 담지만 Map은 요소들의 순서도 기억한다. -> 순서에 따라반복문을 돌릴 수 있다. Map의 프로토타입에 forEach 메소드가 애초에 달려 있다. 요소의 숫자도 size 프라퍼티를 이용해서 접근할 수 있다.
객체는 키로 문자열 또는 심볼만 받는 반면 Map은 어떤 값을 쓰든 상관없다.
즉 요소들을 순회하는 작업을 해야 할 때, 요소의 수량을 추적해야 할 때, 키를 문자열이 아닌 다른 타입으로 설정해야 할 때 Map을 쓰면 좋다.
반면 JSON을 사용할 땐 객체가 유리하고 추가 메소드를 활용한다면 객체를 써야 한다고 한다.
하지만 제일 궁금한 건 효율성.
MDN에 따르면 키-밸류를 자주 넣고 빼야 한다면 객체보다 Map을 쓰는 편이 유리하다. (다만 이 글에 따르면 실제 결과는 다르다고 한다. 정보를 추가하고 제거하는 데는 Map이, 정보를 접근하는 데는 Object가 우수하다고 한다. 반면 이 글에서 보여주는 실험결과는 MDN 설명과 부합한다.)
그리고 데이터 크기가 클 때, 키 타입이 모두 같고 밸류 타입이 동일할 때 Map이 더 빠르다고 한다.
ES6 — Map vs Object — What and when?
You may wonder — why Map vs Object but not Map vs Array, or Object vs Set? Well, you can also compare between any of the two, but Map and…
medium.com
'TIL' 카테고리의 다른 글
Closure의 양면성 ft. 재귀함수 [자바스크립트] (0) | 2020.07.25 |
---|---|
TypeError가 날 때 간단한 debugger 활용 방법 [자바스크립트] (0) | 2020.07.24 |
_.flatten() ft. debugger | Lodash [자바스크립트] (0) | 2020.07.19 |
_.every() | Lodash [자바스크립트] (0) | 2020.07.18 |
Array-like Object 처리, Array.prototype.slice.call() Array.from() 등[자바스크립트] (0) | 2020.07.13 |