Map의 사용법을 예시 코드와 함께 정리해보도록 하겠습니다.
JavaScript의 주요 이터러블(배열, Set, Map)
JavaScript에는 배열, Set, Map라는 3개의 주요 이터러블 데이터 구조가 있습니다. 하나씩 정리해보도록 하겠습니다. 배열 JavScript의 주요 이터러블 중 가장 중요한 것은 가장 자주 작업하게 되는 구조
nicehyun12.tistory.com
Map
객체가 다른 곳에서 사용이 되거나 복사되어 쓰이는 경우 객체 자체에 추가적인 정보를 담고 싶지 않을 수 있습니다.
객체에 몇 가지 정보를 추가하고 싶지만 정보를 객체에 병합하고 싶지 않은 경우 Map을 사용하면 유용합니다.
const personData = new Map();
Map은 항상 new를 사용하여 생성해주며 위와 같이 사용할 경우 빈 Map이 생성되게 됩니다.
const personData = new Map([["key", "some value"]]);
console.log(personData);
Map 생성자는 배열의 배열, 즉 중첩 배열로 초기화할 수 있습니다.
Map은 배열 안에 키-값 쌍을 가진 배열들로 구성된 배열의 배열이기 때문에 중첩 배열을 가지는 것입니다.
key에는 문자열이나 숫자 등 어떤 자료형이든 들어갈 수 있으며 value도 어떤 자료형이든 들어갈 수 있습니다.
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData = new Map([[person1, [{ date: "2022-09-11", price: 10000 }]]]);
console.log(personData);
배열 안에는 person1이라는 객체가 key로 사용되었고 value에는 person1 객체에 직접 추가하고 싶지 않았던 추가적인 정보를 넣을 수 있습니다.
(예를 들어 person1의 구매 정보를 담은 배열을 value에 넣을 수 있습니다.)
배열이 많아 헷갈릴 수도 있는데 전체를 감싸는 배열이 하나 있고, 안에 Map에 추가하려는 하나의 key-value 쌍이 있는 배열이 있는 것입니다.
위의 예시 코드에서는 value에는 또 다른 배열을 가지지만 배열 외에도 다양한 형태의 자료가 들어갈 수 있습니다.
출력 형태가 조금 낯설게 느껴지지만 key가 person1 객체이며,
value는 { date: "2022-09-11", price: 10000 }의 요소를 가진 배열이 요소인 것을 확인할 수 있습니다.
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData = new Map([[person1, [{ date: "2022-09-11", price: 10000 }]]]);
console.log(personData.get(person1));
Map에 저장된 정보는 객체와 두텁게 연결되어 있습니다.
즉 person1 객체와 Map의 key로 받은 person1은 동일한 메모리 공간을 사용하기 때문에 Map에서 쉽게 객체 데이터를 가져와 사용할 수 있습니다.
위의 예시 코드처럼 Map에 get() 함수를 사용하여 key를 전달하면 해당 key에 대한 값을 반환받을 수 있습니다.
get() 함수에 인자로 사용된 person1과 Map의 person1 또한 같은 메모리 공간을 사용합니다.
이때 get() 함수는 동등 비교를 수행하게 되며 동일하다면 문제없이 동작하게 됩니다.
// Map를 이용한 객체의 추가 정보 저장
const person1 = { name: "SH" };
const personData1 = new Map([
[person1, [{ date: "2022-09-11", price: 10000 }]],
]);
console.log(personData1.get(person1));
// 새로운 객체를 만들어 추가 정보 저장
const person2 = { name: "RT" };
const personData2 = { RT: { date: "2022-09-10", price: 12000 } };
console.log(personData2[person2.name]);
위의 예시 코드에서 새로운 객체에 추가 정보를 저장을 하니 기준이 되는 객체의 value를 가져와 key로 따로 지정해줘야 하는 번거로움이 있습니다.
객체가 아닌 Map에 추가 정보를 저장하면 기준이 되는 객체 자체를 키로 사용할 수 있기 때문에 기준이 되는 객체의 value 값을 따로 추가하지 않아도 추가 정보를 쉽게 저장이 가능합니다.
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData1 = new Map([
[person1, [{ date: "2022-09-11", price: 10000 }]],
]);
personData1.set(person2, [{ date: "2022-09-10", price: 12000 }]);
console.log(personData1);
Map에 데이터를 추가할 때는 set() 메서드를 사용하시면 됩니다.
set() 메서드의 인자로는 key-value 쌍을 받을 수 있습니다.
Map에 저장된 데이터를 출력하는 방법 3가지를 예시 코드와 정리해보도록 하겠습니다.
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData1 = new Map([
[person1, [{ date: "2022-09-11", price: 10000 }]],
[person2, [{ date: "2022-09-10", price: 12000 }]],
]);
for (const entry of personData1.entries()) {
console.log(entry);
}
1. entries() 메서드를 사용합니다.
기본적으로 두 개의 요소를 가진 배열, 즉 첫 번째 요소는 key 두 번째 요소는 value인 배열을 반환하게 됩니다.
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData1 = new Map([
[person1, [{ date: "2022-09-11", price: 10000 }]],
[person2, [{ date: "2022-09-10", price: 12000 }]],
]);
for (const [key, value] of personData1.entries()) {
console.log(key, value);
}
2. 배열 구조 분해를 통해 key와 value를 추출합니다
[] 안에 상수의 이름은 원하는 대로 지정이 가능하며 해당 상수에 배열 안 각 위치에 있는 값이 담기게 됩니다.
즉 상수 key에는 배열 안 key의 값인 {name: 'SH'}가, 상수 value에는 배열 안 value의 값인 추가 정보가 담기게 됩니다.
배열 구조 분해
배열을 사용하기를 원하지 않고 배열 안의 각 요소를 개별 값으로 사용하고 싶은 경우가 있을 수 있습니다. 아래 예시 코드와 함께 배열 안 요소를 분리하여 사용하는 방법을 정리해보도록 하겠
nicehyun12.tistory.com
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData1 = new Map([
[person1, [{ date: "2022-09-11", price: 10000 }]],
[person2, [{ date: "2022-09-10", price: 12000 }]],
]);
for (const key of personData1.keys()) {
console.log(key);
}
3-1. key에만 목적이 있는 경우에 keys() 함수를 사용합니다.
keys() 함수를 사용하면 모든 키에 접근이 가능합니다.
3-2.value에만 목적이 있는 경우 values() 함수를 사용합니다.
위의 예시 코드에서 keys() 함수 자리에 values()를 사용해주면 모든 value에 접근이 가능합니다
Map에서 사용 가능한 메서드를 조금 더 정리해보도록 하겠습니다.
clear() 메서드
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData1 = new Map([
[person1, [{ date: "2022-09-11", price: 10000 }]],
[person2, [{ date: "2022-09-10", price: 12000 }]],
]);
personData1.clear();
console.log(personData1);
clear() 메서드를 사용하면 Map의 모든 데이터를 삭제합니다.
delete() 메서드
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData1 = new Map([
[person1, [{ date: "2022-09-11", price: 10000 }]],
[person2, [{ date: "2022-09-10", price: 12000 }]],
]);
personData1.delete(person1);
delete() 메서드를 사용하면 인자로 받은 key에 해당하는 데이터를 삭제합니다.
has() 메서드
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData1 = new Map([
[person1, [{ date: "2022-09-11", price: 10000 }]],
[person2, [{ date: "2022-09-10", price: 12000 }]],
]);
console.log(personData1.has(person1)); // true 출력
has() 메서드를 사용하면 인자로 받은 값이 key로 가진 요소가 있는지를 확인할 수 있습니다.
있으면 true, 없으면 false를 반환합니다.
size
const person1 = { name: "SH" };
const person2 = { name: "RT" };
const personData1 = new Map([
[person1, [{ date: "2022-09-11", price: 10000 }]],
[person2, [{ date: "2022-09-10", price: 12000 }]],
]);
console.log(personData1.size); // 2 출력
size는 메서드는 아니고 프로퍼티로 사용하면 Map의 길이를 확인할 수 있습니다.
정리
어떤 데이터 형식이든 key가 될 수 있으며 추가 정보를 추가할 수 있는데 추가한 정보는 객체에 추가되지 않고 Map에 저장됩니다.
Map에 저장된 데이터는 다른 곳에서 사용이 가능합니다.
'JavaScript' 카테고리의 다른 글
key 이름 / 프로퍼티 접근 / 대괄호표기법 (0) | 2022.09.13 |
---|---|
프로퍼티 추가 / 삭제 (0) | 2022.09.13 |
Set (0) | 2022.09.10 |
JavaScript의 주요 이터러블(배열, Set, Map) (0) | 2022.09.10 |
배열 구조 분해(비구조화할당) (2) | 2022.09.10 |