[JS] π μλ°μ€ν¬λ¦½νΈ μλ£ν Map π© μ 리
μλ°μ€ν¬λ¦½νΈλ κ°μ²΄μ λ°°μ΄μ΄λΌλ κ°λ ₯ν μλ£κ΅¬μ‘°λ₯Ό μ 곡ν©λλ€.
- βκ°μ²΄ – ν€κ° μλ 컬λ μ μ μ μ₯ν¨
- λ°°μ΄ – μμκ° μλ 컬λ μ μ μ μ₯ν¨
βνμ§λ§ νμ€ μΈκ³λ₯Ό λ°μνκΈ°μ μ΄ λ μλ£κ΅¬μ‘° λ§μΌλ‘ λΆμ‘±ν΄μ 맡(Map)κ³Ό μ (Set)μ΄ λ±μ₯νκ² λμμ΅λλ€.
Map μλ£ν
βν€κ° μλ λ°μ΄ν°λ₯Ό μ μ₯νλ€λ μ μμ κ°μ²΄μ μ μ¬ν©λλ€.
λ€λ§, 맡μ ν€μ λ€μν μλ£νμ νμ©νλ€λ μ μμ μ°¨μ΄κ° μμ΅λλ€.
(κ°μ²΄μ keyλ νμ μ€νΈλ§ννλ‘ μ μ₯λ©λλ€.)
let map1 = new Map([ // 2μ°¨μ key, value ννμ λ°°μ΄
['a',1],
['a1',2],
['b',3]
])
// map μλ£ν : {"a" => 1, "a1" => 2, "b" => 3}
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 – μμμ κ°μλ₯Ό λ°νν©λλ€.
let map = new Map();
map.set('1', 'str1'); // λ¬Έμν ν€
map.set(1, 'num1'); // μ«μν ν€
map.set(true, 'bool1'); // λΆλ¦°ν ν€
/* 2μ°¨μ λ°°μ΄ ννλ‘ νλ°©μ μ μΈ ν μ μμ΄μ
let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
])*/
// κ°μ²΄λ ν€λ₯Ό λ¬ΈμνμΌλ‘ λ³ννλ€λ κ±Έ κΈ°μ΅νκ³ κ³μ κ°μ?
// 맡μ ν€μ νμ
μ λ³νμν€μ§ μκ³ κ·Έλλ‘ μ μ§ν©λλ€. λ°λΌμ μλμ μ½λλ μΆλ ₯λλ κ°μ΄ λ€λ¦
λλ€.
alert( map.get(1) ); // 'num1'
alert( map.get('1') ); // 'str1'
alert( map.size ); // 3
맡μ keyμ μ€λ³΅κ°μ΄ μμΌλ©΄ λμ€κ°μΌλ‘ μ μ©λ©λλ€. (μ΄λ κ°μ²΄λ λ§μ°¬κ°μ§)
let map1 = new Map([
['a',1],
['a',2],
['b',3]
]) // {"a" => 2, "b" => 3}
let object1 = {
a:1,
a:2,
b:3
} // {a: 2, b: 3}
const errorMessageObj = {
404 : "νμ΄μ§κ° μμ΅λλ€",
500 : "μλ² μ€λ₯μ
λλ€",
401 : "κΆνμ΄ μμ΅λλ€"
}
errorMessageObj.404 // unexpected number μλ¬. keyκ°μ λ¬Έμμ΄ μ²λ¦¬κ° λμ΄μ λ¬Έμμ΄λ‘ μ κ·Όν΄μΌν¨
errorMessageObj["404"] // 'νμ΄μ§κ° μμ΅λλ€' μ μμ κ·Ό
const errorMessageMap = new Map([
[404, "νμ΄μ§κ° μμ΅λλ€"],
[500, "μλ² μ€λ₯μ
λλ€"],
[401, "κΆνμ΄ μμ΅λλ€"],
])
errorMessageMap.get(404) // 'νμ΄μ§κ° μμ΅λλ€' λ°λ‘ λ¬Έμμ΄ μ²λ¦¬μμ΄, μ μμ κ·Ό
맡μ κ°μ²΄μ λ¬λ¦¬ ν€λ₯Ό λ¬ΈμνμΌλ‘ λ³ννμ§ μμ΅λλ€. ν€μ μλ£ν μ μ½μ΄ μμ΅λλ€.
βmap[key]λ Mapμ μ°λ λ°λ₯Έ λ°©λ²μ΄ μλλλ€.
map[key] = 2λ‘ κ°μ μ€μ νλ κ² κ°μ΄ map[key]λ₯Ό μ¬μ©ν μ μκΈ΄ ν©λλ€. νμ§λ§ μ΄ λ°©λ²μ mapμ μΌλ° κ°μ²΄μ²λΌ μ·¨κΈνκ² λ©λλ€. λ°λΌμ μ¬λ¬ μ μ½μ΄ μκΈ°κ² λμ£ .
mapμ μ¬μ©ν λ mapμ μ© λ©μλ set, get λ±μ μ¬μ©ν΄μΌλ§ ν©λλ€.
맡μ ν€λ‘ κ°μ²΄λ νμ©ν©λλ€.
let john = { name: "John" };
// κ³ κ°μ κ°κ² λ°©λ¬Έ νμλ₯Ό μΈλ³Έλ€κ³ κ°μ ν΄ λ΄
μλ€.
let visitsCountMap = new Map();
// johnμ 맡μ ν€λ‘ μ¬μ©νκ² μ΅λλ€.
visitsCountMap.set(john, 123);
alert( visitsCountMap.get(john) ); // 123
β
λ€μμ guestArr λ°°μ΄μ μ΄λ¦κ³Ό μ΄κ³ μλ λμκ° μ μ₯λμ΄ μλ μλ£λ€μ΄ μ μ₯λμ΄ μμ΅λλ€.
μ΄λ₯Ό λμλ³λ‘ λ¬Άμ΄ μλ‘ μλ£λ₯Ό μ μ₯νλ €κ³ ν©λλ€.
let guestArr = [
{name:"A", city:"Seoul"},
{name:"B", city:"Busan"},
{name:"C", city:"Seoul"},
{name:"D", city:"Sejong"},
{name:"E", city:"Busan"},
{name:"F", city:"Sejong"},
{name:"G", city:"Dawgeon"},
{name:"H", city:"Sejong"},
{name:"I", city:"Dawgeon"},
{name:"J", city:"Busan"},
{name:"K", city:"Seoul"},
]
let Oguest = {};
guestArr.forEach(item => {
if (!Oguest[item.city]) Oguest[item.city] = [];
Oguest[item.city].push(item);
});
console.log("[Object] : ", Oguest);
forEach()λ₯Ό μ¬μ©ν΄μ κΈ°μ‘΄ κ°μ²΄ μ μ₯λ²μ μ¬μ©νλ©΄ μ΄λ κ² λ©λλ€.
λ¨Όμ μλ‘μ΄ κ°μ²΄ Oguestμ ν΄λΉ λμλͺ item.cityκ° μμΌλ©΄ = [] λ°°μ΄μ μλ‘ λ£μ΄μ€λλ€.
κ·Έλ¦¬κ³ push()λ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό λ£μ΄μ€λλ€.
β
μ¬κΈ°μ keyκ°μ΄ λ item.cityλ μ€νΈλ§μ΄ μ μ₯λ λ³μνν μΈλ°,
μ΄λ₯Ό κ°μ²΄μ λ°μμ€κΈ° μν΄μ , Oguest.item.city = [] ννλ‘ ν μλ μμ΅λλ€. μλνλ©΄ κ°μ²΄ keyμλ λ³μκ° μ¬μ μκ³ λ¬΄μ‘°κ±΄ μ€νΈλ§λ§ μ€κΈ° λλ¬Έμ΄μ£ .
κ·Έλμ λ°°μ΄ννλ‘ μ κ·Όν΄μ μΈλ±μ€μ λ£λ μμΌλ‘ ν΄μΌ ν©λλ€. Oguest[item.city] = []
νμ§λ§ Mapμ μ°λ©΄ μ’λ μ§κ΄μ μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
map.has()λ‘ ν€κ°μ κ²μ¬νκ³ , μμΌλ©΄ map.set()μ ν΅ν΄ keyμ valueλ₯Ό λ£μ΄μ€λλ€.
κ·Έλ¦¬κ³ map.getμΌλ‘ keyλ₯Ό κ°μ Έμ valueμ μλ λ°°μ΄μ push() ν΄μ€λλ€.
let Mguest = new Map();
guestArr.forEach(item => {
if (!Mguest.has(item.city)) Mguest.set(item.city, []);
Mguest.get(item.city).push(item);
});
console.log("[Map] : ", Mguest);
* 체μ΄λ
map.setμ νΈμΆν λλ§λ€ 맡 μμ μ΄ λ°νλ©λλ€.
μ΄λ₯Ό μ΄μ©νλ©΄ map.setμ '체μ΄λ(chaining)'ν μ μμ΅λλ€.
map.set('1', 'str1') .set(1, 'num1') .set(true, 'bool1');
맡μ μμμ λ°λ³΅ μμ νκΈ°
β
λ€μ μΈ κ°μ§ λ©μλλ₯Ό μ¬μ©ν΄ 맡μ κ° μμμ λ°λ³΅ μμ μ ν μ μμ΅λλ€.
map.keys() – κ° μμμ ν€λ₯Ό λͺ¨μ λ°λ³΅ κ°λ₯ν(iterable, μ΄ν°λ¬λΈ) κ°μ²΄λ₯Ό λ°νν©λλ€.
map.values() – κ° μμμ κ°μ λͺ¨μ μ΄ν°λ¬λΈ κ°μ²΄λ₯Ό λ°νν©λλ€.
map.entries() – μμμ [ν€, κ°]μ ν μμΌλ‘ νλ μ΄ν°λ¬λΈ κ°μ²΄λ₯Ό λ°νν©λλ€. μ΄ μ΄ν°λ¬λΈ κ°μ²΄λ for..ofλ°λ³΅λ¬Έμ κΈ°μ΄λ‘ μ°μ λλ€.
let recipeMap = new Map([
['cucumber', 500],
['tomatoes', 350],
['onion', 50]
]);
// ν€(vegetable)λ₯Ό λμμΌλ‘ μνν©λλ€.
for (let vegetable of recipeMap.keys()) {
alert(vegetable); // cucumber, tomatoes, onion
}
// κ°(amount)μ λμμΌλ‘ μνν©λλ€.
for (let amount of recipeMap.values()) {
alert(amount); // 500, 350, 50
}
// [ν€, κ°] μμ λμμΌλ‘ μνν©λλ€.
for (let entry of recipeMap) { // recipeMap.entries()μ λμΌν©λλ€.
alert(entry); // cucumber,500 ...
}
맡μ μ½μ μμλ₯Ό κΈ°μ΅ν©λλ€. (μ΄ν°λ¬λΈ κ°μ²΄)
맡μ κ°μ΄ μ½μ λ μμλλ‘ μνλ₯Ό μ€μν©λλ€.
κ°μ²΄κ° νλ‘νΌν° μμλ₯Ό κΈ°μ΅νμ§ λͺ»νλ κ²κ³Όλ λ€λ¦ λλ€.
μ¬κΈ°μ λνμ¬ λ§΅μ λ°°μ΄κ³Ό μ μ¬νκ² λ΄μ₯ λ©μλ forEachλ μ§μν©λλ€.
// κ° (ν€, κ°) μμ λμμΌλ‘ ν¨μλ₯Ό μ€ν
recipeMap.forEach( (value, key, map) => {
alert(`${key}: ${value}`); // cucumber: 500 ...
});
κ°μ²΄ -> 맡 μΌλ‘ λ°κΎΈκΈ°
νλ²ν κ°μ²΄λ₯Ό κ°μ§κ³ 맡μ λ§λ€κ³ μΆλ€λ©΄ λ΄μ₯ λ©μλ Object.entries(obj)λ₯Ό νμ©ν΄μΌ ν©λλ€.
μ΄ λ©μλλ κ°μ²΄μ ν€-κ° μμ μμ([key, value])λ‘ κ°μ§λ λ°°μ΄μ λ°νν©λλ€.
// κ·Έλ₯ 맡 λ§λ€κΈ° (κ° μμκ° [ν€, κ°] μμΈ λ°°μ΄)
let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);
// κ°μ²΄λ‘ 맡 λ§λ€κΈ°
let obj = {
name: "John",
age: 30
};
let map2 = new Map(Object.entries(obj)); // κ°μ²΄λ₯Ό 2μ°¨μμ ν€:λ°Έλ₯ ννλ‘ λ§λ€κ³ 맡μΌλ‘ λ³ν
// [ ["name","John"], ["age", 30] ]
alert( map2.get('name') ); // John
Object.entriesλ₯Ό μ¬μ©ν΄ κ°μ²΄ objλ₯Ό λ°°μ΄ [ ["name","John"], ["age", 30] ]λ‘ λ°κΎΈκ³ , μ΄ λ°°μ΄μ μ΄μ©ν΄ μλ‘μ΄ λ§΅μ λ§λ€μ΄λ³΄μμ΅λλ€.
β
맡 -> κ°μ²΄ λ‘ λ°κΎΈκΈ°
μ΄ λ°λμΈ λ§΅μ κ°μ²΄λ‘ λ°κΎΈλ λ°©λ²μ λν΄ μμλ³΄κ² μ΅λλ€.
Object.fromEntriesλ₯Ό μ¬μ©νλ©΄ κ°λ₯ν©λλ€. μ΄ λ©μλλ κ° μμκ° [ν€, κ°] μμΈ λ°°μ΄μ κ°μ²΄λ‘ λ°κΏμ€λλ€.
μλ£κ° 맡μ μ μ₯λμ΄μλλ°, μλνν° μ½λμμ μλ£λ₯Ό κ°μ²΄ννλ‘ λ겨λ°κΈΈ μν λ μ΄ λ°©λ²μ μ¬μ©ν μ μμ΅λλ€.
let map = new Map();
map.set('banana', 1);
map.set('orange', 2);
map.set('meat', 4);
let obj = Object.fromEntries(map.entries()); // 맡μ μΌλ° κ°μ²΄λ‘ λ³ν (*)
// let obj = Object.fromEntries(map); // .entries()λ₯Ό μλ΅ν μ μμ.
// λ§΅μ΄ κ°μ²΄κ° λμμ΅λλ€!
// obj = { banana: 1, orange: 2, meat: 4 }
alert(obj.orange); // 2
Reference