ì§ê¸ê¹ì§ ìëì ê°ì ë³µì¡í ìë£êµ¬ì¡°ë¥¼ íìµí´ ë³´ììµëë¤.
- ê°ì²´ â í¤ê° ìë 컬ë ì ì ì ì¥í¨
- ë°°ì´ â ììê° ìë 컬ë ì ì ì ì¥í¨
íì§ë§ íì¤ ì¸ê³ë¥¼ ë°ìí기ì ì´ ë ìë£êµ¬ì¡° ë§ì¼ë¡ ë¶ì¡±í´ì ë§µ(Map)ê³¼ ì
(Set)ì´ ë±ì¥íê² ëììµëë¤.
ë§µ
ë§µ(Map)ì í¤ê° ìë ë°ì´í°ë¥¼ ì ì¥íë¤ë ì ìì ê°ì²´ì ì ì¬í©ëë¤. ë¤ë§, ë§µì í¤ì ë¤ìí ìë£íì íì©íë¤ë ì ìì ì°¨ì´ê° ììµëë¤.
ë§µìë ë¤ìê³¼ ê°ì 주ì ë©ìëì íë¡í¼í°ê° ììµëë¤.
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'); // ë¶ë¦°í í¤
// ê°ì²´ë í¤ë¥¼ 문ìíì¼ë¡ ë³ííë¤ë 걸 기ìµíê³ ê³ì ê°ì?
// ë§µì í¤ì íì
ì ë³íìí¤ì§ ìê³ ê·¸ëë¡ ì ì§í©ëë¤. ë°ë¼ì ìëì ì½ëë ì¶ë ¥ëë ê°ì´ ë¤ë¦
ëë¤.
alert( map.get(1) ); // 'num1'
alert( map.get('1') ); // 'str1'
alert( map.size ); // 3
ë§µì ê°ì²´ì ë¬ë¦¬ í¤ë¥¼ 문ìíì¼ë¡ ë³ííì§ ììµëë¤. í¤ì ìë£í ì ì½ì´ ììµëë¤.
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
ê°ì²´ë¥¼ í¤ë¡ ì¬ì©í ì ìë¤ë ì ì ë§µì ê°ì¥ ì¤ìí ê¸°ë¥ ì¤ íëì
ëë¤. ê°ì²´ìë 문ìì´ í¤ë¥¼ ì¬ì©í ì ììµëë¤. íì§ë§ ê°ì²´ í¤ë ì¬ì©í ì ììµëë¤.
ê°ì²´í í¤ë¥¼ ê°ì²´ì ì¨ë´
ìë¤.
let john = { name: "John" };
let visitsCountObj = {}; // ê°ì²´ë¥¼ íë ë§ëëë¤.
visitsCountObj[john] = 123; // ê°ì²´(john)를 í¤ë¡ í´ì ê°ì²´ì ê°(123)ì ì ì¥í´ë´
ìë¤.
// ìíë ê°(123)ì ì»ì¼ë ¤ë©´ ìëì ê°ì´ í¤ê° ë¤ì´ê° ì리ì `object Object`를 ì¨ì¤ì¼í©ëë¤.
alert( visitsCountObj["[object Object]"] ); // 123
visitsCountObjë ê°ì²´ì´ê¸° ë문ì 모ë í¤ë¥¼ 문ìíì¼ë¡ ë³íìíµëë¤. ì´ ê³¼ì ìì johnì 문ìíì¼ë¡ ë³íëì´ "[object Object]"ê° ë©ëë¤.
ë§µì´ í¤ë¥¼ ë¹êµíë ë°©ìë§µì SameValueZeroë¼ ë¶ë¦¬ë ìê³ ë¦¬ì¦ì ì¬ì©í´ ê°ì ë±ê° ì¬ë¶ë¥¼ íì¸í©ëë¤. ì´ ìê³ ë¦¬ì¦ì ì¼ì¹ ì°ì°ì ===ì ê±°ì ì ì¬íì§ë§, NaNê³¼ NaNì ê°ë¤ê³ ì·¨ê¸íë ê²ìì ì¼ì¹ ì°ì°ìì ì°¨ì´ê° ììµëë¤. ë°ë¼ì ë§µìì NaNë í¤ë¡ ì¸ ì ììµëë¤.
ì´ ìê³ ë¦¬ì¦ì ìì íê±°ë 커ì¤í°ë§ì´ì§ íë ê²ì´ ë¶ê°ë¥í©ëë¤.
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: ê°ì²´ë¥¼ ë§µì¼ë¡ ë°ê¾¸ê¸°
ê° ììê° í¤-ê° ìì¸ ë°°ì´ì´ë ì´í°ë¬ë¸ ê°ì²´ë¥¼ ì´ê¸°í ì©ëë¡ ë§µì ì ë¬í´ ìë¡ì´ ë§µì ë§ë¤ ì ììµëë¤.
ìëì ê°ì´ ë§ì´ì£ .
// ê° ììê° [í¤, ê°] ìì¸ ë°°ì´
let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);
alert( map.get('1') ); // str1
íë²í ê°ì²´ë¥¼ ê°ì§ê³ ë§µì ë§ë¤ê³ ì¶ë¤ë©´ ë´ì¥ ë©ìë Object.entries(obj)를 íì©í´ì¼ í©ëë¤. ì´ ë©ìëë ê°ì²´ì í¤-ê° ìì ìì([key, value])ë¡ ê°ì§ë ë°°ì´ì ë°íí©ëë¤.
ìì:
let obj = {
name: "John",
age: 30
};
let map = new Map(Object.entries(obj));
alert( map.get('name') ); // John
Object.entries를 ì¬ì©í´ ê°ì²´ obj를 ë°°ì´ [ ["name","John"], ["age", 30] ]ë¡ ë°ê¾¸ê³ , ì´ ë°°ì´ì ì´ì©í´ ìë¡ì´ ë§µì ë§ë¤ì´ë³´ììµëë¤.
Object.fromEntries: ë§µì ê°ì²´ë¡ ë°ê¾¸ê¸°
ë°©ê¸ê¹ì§ Object.entries(obj)를 ì¬ì©í´ íë²í ê°ì²´ë¥¼ ë§µì¼ë¡ ë°ê¾¸ë ë°©ë²ì ëí´ ììë³´ììµëë¤.
ì´ì ì´ ë°ëì¸ ë§µì ê°ì²´ë¡ ë°ê¾¸ë ë°©ë²ì ëí´ ììë³´ê² ìµëë¤. Object.fromEntries를 ì¬ì©íë©´ ê°ë¥í©ëë¤. ì´ ë©ìëë ê° ììê° [í¤, ê°] ìì¸ ë°°ì´ì ê°ì²´ë¡ ë°ê¿ì¤ëë¤.
let prices = Object.fromEntries([
['banana', 1],
['orange', 2],
['meat', 4]
]);
// now prices = { banana: 1, orange: 2, meat: 4 }
alert(prices.orange); // 2
Object.fromEntries를 ì¬ì©í´ ë§µì ê°ì²´ë¡ ë°ê¿ë´
ìë¤.
ìë£ê° ë§µì ì ì¥ëì´ìëë°, ìëíí° ì½ëìì ìë£ë¥¼ ê°ì²´ííë¡ ë겨ë°ê¸¸ ìí ë ì´ ë°©ë²ì ì¬ì©í ì ììµëë¤.
ìì:
let map = new Map();
map.set('banana', 1);
map.set('orange', 2);
map.set('meat', 4);
let obj = Object.fromEntries(map.entries()); // ë§µì ì¼ë° ê°ì²´ë¡ ë³í (*)
// ë§µì´ ê°ì²´ê° ëììµëë¤!
// obj = { banana: 1, orange: 2, meat: 4 }
alert(obj.orange); // 2
map.entries()를 í¸ì¶íë©´ ë§µì [í¤, ê°]ì ììë¡ ê°ì§ë ì´í°ë¬ë¸ì ë°íí©ëë¤. Object.fromEntries를 ì¬ì©í기 ìí´ ë± ë§ë ííì´ì£ .
(*)ë¡ íìí ì¤ì ì¢ ë ì§§ê² ì¤ì´ë ê²ë ê°ë¥í©ëë¤.
let obj = Object.fromEntries(map); // .entries()를 ìëµí¨
Object.fromEntriesë ì¸ìë¡ ì´í°ë¬ë¸ ê°ì²´ë¥¼ ë°ê¸° ë문ì ì§§ê² ì¤ì¸ ì½ëë ì´ì ì½ëì ëì¼íê² ëìí©ëë¤. ê¼ ë°°ì´ì ì ë¬í´ì¤ íìë ììµëë¤. ê·¸ë¦¬ê³ mapììì ì¼ë°ì ì¸ ë°ë³µì map.entries()를 ì¬ì©íì ëì ê°ì í¤-ê° ìì ë°íí©ëë¤. ë°ë¼ì mapê³¼ ëì¼í í¤-ê°ì ê°ì§ ì¼ë° ê°ì²´ë¥¼ ì»ê² ë©ëë¤.
ì
ì
(Set)ì ì¤ë³µì íì©íì§ ìë ê°ì 모ìëì í¹ë³í 컬ë ì
ì
ëë¤. ì
ì í¤ê° ìë ê°ì´ ì ì¥ë©ëë¤.
주ì ë©ìëë ë¤ìê³¼ ê°ìµëë¤.
new Set(iterable)â ì ì ë§ëëë¤.ì´í°ë¬ë¸ê°ì²´ë¥¼ ì ë¬ë°ì¼ë©´(ëê° ë°°ì´ì ì ë¬ë°ì) ê·¸ ìì ê°ì ë³µì¬í´ ì ì ë£ì´ì¤ëë¤.set.add(value)â ê°ì ì¶ê°íê³ ì ìì ì ë°íí©ëë¤.set.delete(value)â ê°ì ì ê±°í©ëë¤. í¸ì¶ ìì ì ì ë´ì ê°ì´ ìì´ì ì ê±°ì ì±ê³µíë©´true, ìëë©´false를 ë°íí©ëë¤.set.has(value)â ì ë´ì ê°ì´ ì¡´ì¬íë©´true, ìëë©´false를 ë°íí©ëë¤.set.clear()â ì ì ë¹ìëë¤.set.sizeâ ì ì ëª ê°ì ê°ì´ ìëì§ ì¸ì¤ëë¤.
ì
ë´ì ëì¼í ê°(value)ì´ ìë¤ë©´ set.add(value)ì ì무리 ë§ì´ í¸ì¶íëë¼ë ìë¬´ë° ë°ìì´ ìì ê²ëë¤. ì
ë´ì ê°ì ì¤ë³µì´ ìë ì´ì ê° ë°ë¡ ì´ ë문ì´ì£ .
방문ì ë°©ëª ë¡ì ë§ë ë¤ê³ ê°ì í´ ë´ ìë¤. í 방문ìê° ì¬ë¬ ë² ë°©ë¬¸í´ë 방문ì를 ì¤ë³µí´ì 기ë¡íì§ ìê² ë¤ê³ ê²°ì ë´ë¦° ìí©ì ëë¤. ì¦, í 방문ìë 'ë¨ í ë²ë§ 기ë¡âëì´ì¼ í©ëë¤.
ì´ë ì í©í ìë£êµ¬ì¡°ê° ë°ë¡ ì
ì
ëë¤.
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
// ì´ë¤ ê³ ê°(john, mary)ì ì¬ë¬ ë² ë°©ë¬¸í ì ììµëë¤.
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);
// ì
ìë ì ì¼ë¬´ì´í ê°ë§ ì ì¥ë©ëë¤.
alert( set.size ); // 3
for (let user of set) {
alert(user.name); // // John, Pete, Mary ìì¼ë¡ ì¶ë ¥ë©ëë¤.
}
ì
ëì ë°°ì´ì ì¬ì©íì¬ ë°©ë¬¸ì ì 보를 ì ì¥í í, ì¤ë³µ ê° ì¬ë¶ë ë°°ì´ ë©ìëì¸ arr.find를 ì´ì©í´ íì¸í ìë ììµëë¤. íì§ë§ arr.findë ë°°ì´ ë´ ìì ì 체를 ë¤ì ¸ ì¤ë³µ ê°ì 찾기 ë문ì, ì
ë³´ë¤ ì±ë¥ ë©´ìì ë¨ì´ì§ëë¤. ë°ë©´, ì
ì ê°ì ì ì¼ë¬´ì´í¨ì íì¸íëë° ìµì íëì´ììµëë¤.
ì ì ê°ì ë°ë³µ ìì í기
for..ofë forEach를 ì¬ì©íë©´ ì
ì ê°ì ëìì¼ë¡ ë°ë³µ ìì
ì ìíí ì ììµëë¤.
let set = new Set(["oranges", "apples", "bananas"]);
for (let value of set) alert(value);
// forEach를 ì¬ì©í´ë ëì¼íê² ëìí©ëë¤.
set.forEach((value, valueAgain, set) => {
alert(value);
});
í¥ë¯¸ë¡ì´ ì ì´ ëì ëë¤ì. forEachì ì°ì¸ ì½ë°± í¨ìë ì¸ ê°ì ì¸ì를 ë°ëë°, 첫 ë²ì§¸ë ê°, ë ë²ì§¸ë ê°ì ê°ì¸ valueAgainì ë°ê³ ììµëë¤. ì¸ ë²ì§¸ë 목ííë ê°ì²´(ì
)ì´ê³ ì. ëì¼í ê°ì´ ì¸ìì ë ë² ë±ì¥íê³ ììµëë¤.
ì´ë ê² êµ¬íë ì´ì ë 맵과ì í¸íì± ë문ì
ëë¤. ë§µì forEachì ì°ì¸ ì½ë°±ì´ ì¸ ê°ì ì¸ì를 ë°ì ë를 ìí´ìì£ . ì´ìí´ ë³´ì´ê² ì§ë§ ì´ë ê² êµ¬íí´ ëì기 ë문ì ë§µì ì
ì¼ë¡ í¹ì ì
ì ë§µì¼ë¡ êµì²´íê¸°ê° ì½ìµëë¤.
ì
ìë 맵과 ë§ì°¬ê°ì§ë¡ ë°ë³µ ìì
ì ìí ë©ìëê° ììµëë¤.
set.keys()â ì ë´ì 모ë ê°ì í¬í¨íë ì´í°ë¬ë¸ ê°ì²´ë¥¼ ë°íí©ëë¤.set.values()âset.keysì ëì¼í ìì ì í©ëë¤.맵과ì í¸íì±ì ìí´ ë§ë¤ì´ì§ ë©ìëì ëë¤.set.entries()â ì ë´ì ê° ê°ì ì´ì©í´ ë§ë[value, value]ë°°ì´ì í¬í¨íë ì´í°ë¬ë¸ ê°ì²´ë¥¼ ë°íí©ëë¤.맵과ì í¸íì±ì ìí´ ë§ë¤ì´ì¡ìµëë¤.
ìì½
ë§µì í¤ê° ìë ê°ì´ ì ì¥ë 컬ë ì
ì
ëë¤.
주ì ë©ìëì íë¡í¼í°:
new Map([iterable])â ë§µì ë§ëëë¤.[key,value]ìì´ ìëiterable(ì: ë°°ì´)ì ì íì ì¼ë¡ ë길 ì ìëë°, ì´ë ë긴 ì´í°ë¬ë¸ ê°ì²´ë ë§µ ì´ê¸°íì ì¬ì©ë©ëë¤.map.set(key, value)â í¤ë¥¼ ì´ì©í´ ê°ì ì ì¥í©ëë¤.map.get(key)â í¤ì í´ë¹íë ê°ì ë°íí©ëë¤.keyê° ì¡´ì¬íì§ ìì¼ë©´undefined를 ë°íí©ëë¤.map.has(key)â í¤ê° ìì¼ë©´true, ìì¼ë©´false를 ë°íí©ëë¤.map.delete(key)â í¤ì í´ë¹íë ê°ì ìì í©ëë¤.map.clear()â ë§µ ìì 모ë ìì를 ì ê±°í©ëë¤.map.sizeâ ììì ê°ì를 ë°íí©ëë¤.
ì¼ë°ì ì¸ ê°ì²´ìì ì°¨ì´ì :
- í¤ì íì ì ì ì½ì´ ììµëë¤. ê°ì²´ë í¤ê° ë ì ììµëë¤.
sizeíë¡í¼í° ë±ì ì ì©í ë©ìëë íë¡í¼í°ê° ììµëë¤.
ì
ì ì¤ë³µì´ ìë ê°ì ì ì¥í ë ì°ì´ë 컬ë ì
ì
ëë¤.
주ì ë©ìëì íë¡í¼í°:
new Set([iterable])â ì ì ë§ëëë¤.iterableê°ì²´ë¥¼ ì íì ì¼ë¡ ì ë¬ë°ì ì ìëë°(ëê° ë°°ì´ì ì ë¬ë°ì), ì´í°ë¬ë¸ ê°ì²´ ìì ììë ì ì ì´ê¸°ííëë° ì°ì ëë¤.set.add(value)â ê°ì ì¶ê°íê³ ì ìì ì ë°íí©ëë¤. ì ë´ì ì´ë¯¸valueê° ìë ê²½ì° ìë¬´ë° ìì ì íì§ ììµëë¤.set.delete(value)â ê°ì ì ê±°í©ëë¤. í¸ì¶ ìì ì ì ë´ì ê°ì´ ìì´ì ì ê±°ì ì±ê³µíë©´true, ìëë©´false를 ë°íí©ëë¤.set.has(value)â ì ë´ì ê°ì´ ì¡´ì¬íë©´true, ìëë©´false를 ë°íí©ëë¤.set.clear()â ì ì ë¹ìëë¤.set.sizeâ ì ì ëª ê°ì ê°ì´ ìëì§ ì¸ì¤ëë¤.
맵과 ì
ì ë°ë³µ ìì
ì í ë, í´ë¹ 컬ë ì
ì ììë ê°ì ì¶ê°í ììëë¡ ë°ë³µ ìì
ì´ ìíë©ëë¤. ë°ë¼ì ì´ ë 컬ë ì
ì ì ë ¬ì´ ëì´ìì§ ìë¤ê³ í ì ììµëë¤. ê·¸ë ì§ë§ 컬ë ì
ë´ ììë ê°ì ì¬ ì ë ¬íê±°ë (ë°°ì´ìì ì¸ë±ì¤ë¥¼ ì´ì©í´ ìì를 ê°ì ¸ì¤ë ê²ì²ë¼) ì«ì를 ì´ì©í´ í¹ì ììë ê°ì ê°ì§ê³ ì¤ë ê²ì ë¶ê°ë¥í©ëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.