å¦å°ç°å¨ï¼æä»¬å·²ç»äºè§£äºä»¥ä¸å¤æçæ°æ®ç»æï¼
- 对象ï¼åå¨å¸¦æé®çæ°æ®çéåã
- æ°ç»ï¼å卿åºéåã
ä½è¿è¿ä¸è¶³ä»¥åºå¯¹ç°å®æ
åµãè¿å°±æ¯ä¸ºä»ä¹åå¨ Map å Setã
Map
Map æ¯ä¸ä¸ªå¸¦é®çæ°æ®é¡¹çéåï¼å°±åä¸ä¸ª Object 䏿 ·ã 使¯å®ä»¬æå¤§ç差嫿¯ Map å
许任ä½ç±»åçé®ï¼keyï¼ã
å®çæ¹æ³å屿§å¦ä¸ï¼
new Map()ââ å建 mapãmap.set(key, value)ââ æ ¹æ®é®åå¨å¼ãmap.get(key)ââ æ ¹æ®é®æ¥è¿åå¼ï¼å¦æmapä¸ä¸åå¨å¯¹åºçkeyï¼åè¿åundefinedãmap.has(key)ââ 妿keyåå¨åè¿åtrueï¼å¦åè¿åfalseãmap.delete(key)ââ å 餿å®é®çå¼ãmap.clear()ââ æ¸ 空 mapãmap.sizeââ è¿åå½åå ç´ ä¸ªæ°ã
举个ä¾åï¼
let map = new Map();
map.set('1', 'str1'); // å符串é®
map.set(1, 'num1'); // æ°åé®
map.set(true, 'bool1'); // å¸å°å¼é®
// è¿è®°å¾æ®éç Object å? å®ä¼å°é®è½¬å为å符串
// Map åä¼ä¿çé®çç±»åï¼æä»¥ä¸é¢è¿ä¸¤ä¸ªç»æä¸åï¼
alert( map.get(1) ); // 'num1'
alert( map.get('1') ); // 'str1'
alert( map.size ); // 3
妿们æè§ï¼ä¸å¯¹è±¡ä¸åï¼é®ä¸ä¼è¢«è½¬æ¢æå符串ãé®å¯ä»¥æ¯ä»»ä½ç±»åã
map[key] 䏿¯ä½¿ç¨ Map çæ£ç¡®æ¹å¼è½ç¶ map[key] 乿æï¼ä¾å¦æä»¬å¯ä»¥è®¾ç½® map[key] = 2ï¼è¿æ ·ä¼å° map è§ä¸º JavaScript ç plain objectï¼å æ¤å®æå«äºææç¸åºçéå¶ï¼ä»
æ¯æ string/symbol é®çï¼ã
æä»¥æä»¬åºè¯¥ä½¿ç¨ map æ¹æ³ï¼set å get çã
Map è¿å¯ä»¥ä½¿ç¨å¯¹è±¡ä½ä¸ºé®ã
ä¾å¦ï¼
let john = { name: "John" };
// å卿¯ä¸ªç¨æ·çæ¥è®¿æ¬¡æ°
let visitsCountMap = new Map();
// john æ¯ Map ä¸çé®
visitsCountMap.set(john, 123);
alert( visitsCountMap.get(john) ); // 123
使ç¨å¯¹è±¡ä½ä¸ºé®æ¯ Map æå¼å¾æ³¨æåéè¦çåè½ä¹ä¸ãå¨ Object ä¸ï¼æä»¬åæ æ³ä½¿ç¨å¯¹è±¡ä½ä¸ºé®ãå¨ Object ä¸ä½¿ç¨å符串ä½ä¸ºé®æ¯å¯ä»¥çï¼ä½æä»¬æ æ³ä½¿ç¨å¦ä¸ä¸ª Object ä½ä¸º Object ä¸çé®ã
æä»¬æ¥å°è¯ä¸ä¸ï¼
let john = { name: "John" };
let ben = { name: "Ben" };
let visitsCountObj = {}; // å°è¯ä½¿ç¨å¯¹è±¡
visitsCountObj[ben] = 234; // å°è¯å°å¯¹è±¡ ben ç¨ä½é®
visitsCountObj[john] = 123; // å°è¯å°å¯¹è±¡ john ç¨ä½é®ï¼ä½æä»¬ä¼åç°ä½¿ç¨å¯¹è±¡ ben ä½ä¸ºé®åä¸çå¼ä¼è¢«æ¿æ¢æ
// åæè¿æ ·äºï¼
alert( visitsCountObj["[object Object]"] ); // 123
å 为 visitsCountObj æ¯ä¸ä¸ªå¯¹è±¡ï¼å®ä¼å°ææ Object é®ä¾å¦ä¸é¢ç john å ben 转æ¢ä¸ºå符串 "[object Object]"ãè¿æ¾ç¶ä¸æ¯æä»¬æ³è¦çç»æã
Map æ¯æä¹æ¯è¾é®çï¼Map ä½¿ç¨ SameValueZero ç®æ³æ¥æ¯è¾é®æ¯å¦ç¸çãå®åä¸¥æ ¼çäº === å·®ä¸å¤ï¼ä½åºå«æ¯ NaN è¢«çææ¯çäº NaNãæä»¥ NaN ä¹å¯ä»¥è¢«ç¨ä½é®ã
è¿ä¸ªç®æ³ä¸è½è¢«æ¹åæè èªå®ä¹ã
æ¯ä¸æ¬¡ map.set è°ç¨é½ä¼è¿å map æ¬èº«ï¼æä»¥æä»¬å¯ä»¥è¿è¡âé¾å¼âè°ç¨ï¼
map.set('1', 'str1')
.set(1, 'num1')
.set(true, 'bool1');
Map è¿ä»£
妿è¦å¨ map é使ç¨å¾ªç¯ï¼å¯ä»¥ä½¿ç¨ä»¥ä¸ä¸ä¸ªæ¹æ³ï¼
map.keys()ââ éåå¹¶è¿åä¸ä¸ªå 嫿æé®çå¯è¿ä»£å¯¹è±¡ï¼map.values()ââ éåå¹¶è¿åä¸ä¸ªå 嫿æå¼çå¯è¿ä»£å¯¹è±¡ï¼map.entries()ââ éåå¹¶è¿åä¸ä¸ªå 嫿æå®ä½[key, value]çå¯è¿ä»£å¯¹è±¡ï¼for..ofå¨é»è®¤æ åµä¸ä½¿ç¨çå°±æ¯è¿ä¸ªã
ä¾å¦ï¼
let recipeMap = new Map([
['cucumber', 500],
['tomatoes', 350],
['onion', 50]
]);
// éåææçé®ï¼vegetablesï¼
for (let vegetable of recipeMap.keys()) {
alert(vegetable); // cucumber, tomatoes, onion
}
// éåææçå¼ï¼amountsï¼
for (let amount of recipeMap.values()) {
alert(amount); // 500, 350, 50
}
// éåææçå®ä½ [key, value]
for (let entry of recipeMap) { // ä¸ recipeMap.entries() ç¸å
alert(entry); // cucumber,500 (and so on)
}
è¿ä»£ç顺åºä¸æå
¥å¼ç顺åºç¸åã䏿®éç Object ä¸åï¼Map ä¿çäºæ¤é¡ºåºã
餿¤ä¹å¤ï¼Map æå
建ç forEach æ¹æ³ï¼ä¸ Array 类似ï¼
// 对æ¯ä¸ªé®å¼å¯¹ (key, value) è¿è¡ forEach 彿°
recipeMap.forEach( (value, key, map) => {
alert(`${key}: ${value}`); // cucumber: 500 etc
});
Object.entriesï¼ä»å¯¹è±¡å建 Map
å½å建ä¸ä¸ª Map åï¼æä»¬å¯ä»¥ä¼ å
¥ä¸ä¸ªå¸¦æé®å¼å¯¹çæ°ç»ï¼æå
¶å®å¯è¿ä»£å¯¹è±¡ï¼æ¥è¿è¡åå§åï¼å¦ä¸æç¤ºï¼
// é®å¼å¯¹ [key, value] æ°ç»
let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);
alert( map.get('1') ); // str1
妿æä»¬æ³ä»ä¸ä¸ªå·²æçæ®é对象ï¼plain objectï¼æ¥å建ä¸ä¸ª Mapï¼é£ä¹æä»¬å¯ä»¥ä½¿ç¨å
å»ºæ¹æ³ Object.entries(obj)ï¼è¯¥æ¹æ³è¿å对象çé®/å¼å¯¹æ°ç»ï¼è¯¥æ°ç»æ ¼å¼å®å
¨æç
§ Map æéçæ ¼å¼ã
æä»¥å¯ä»¥åä¸é¢è¿æ ·ä»ä¸ä¸ªå¯¹è±¡å建ä¸ä¸ª Mapï¼
let obj = {
name: "John",
age: 30
};
let map = new Map(Object.entries(obj));
alert( map.get('name') ); // John
è¿éï¼Object.entries è¿åé®/å¼å¯¹æ°ç»ï¼[ ["name","John"], ["age", 30] ]ãè¿å°±æ¯ Map æéè¦çæ ¼å¼ã
Object.fromEntriesï¼ä» Map å建对象
æä»¬ååå·²ç»å¦ä¹ äºå¦ä½ä½¿ç¨ Object.entries(obj) 仿®é对象ï¼plain objectï¼å建 Mapã
Object.fromEntries æ¹æ³çä½ç¨æ¯ç¸åçï¼ç»å®ä¸ä¸ªå
·æ [key, value] é®å¼å¯¹çæ°ç»ï¼å®ä¼æ ¹æ®ç»å®æ°ç»å建ä¸ä¸ªå¯¹è±¡ï¼
let prices = Object.fromEntries([
['banana', 1],
['orange', 2],
['meat', 4]
]);
// ç°å¨ prices = { banana: 1, orange: 2, meat: 4 }
alert(prices.orange); // 2
æä»¬å¯ä»¥ä½¿ç¨ Object.fromEntries ä» Map å¾å°ä¸ä¸ªæ®é对象ï¼plain objectï¼ã
ä¾å¦ï¼æä»¬å¨ Map ä¸åå¨äºä¸äºæ°æ®ï¼ä½æ¯æä»¬éè¦æè¿äºæ°æ®ä¼ ç»éè¦æ®é对象ï¼plain objectï¼çç¬¬ä¸æ¹ä»£ç ã
æä»¬æ¥å¼å§ï¼
let map = new Map();
map.set('banana', 1);
map.set('orange', 2);
map.set('meat', 4);
let obj = Object.fromEntries(map.entries()); // å建ä¸ä¸ªæ®é对象ï¼plain objectï¼(*)
// 宿äºï¼
// 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() 䏿 ·çé®/å¼å¯¹ãå æ¤ï¼æä»¬å¯ä»¥è·å¾ä¸ä¸ªæ®é对象ï¼plain objectï¼ï¼å
¶é®/å¼å¯¹ä¸ map ç¸åã
Set
Set æ¯ä¸ä¸ªç¹æ®çç±»åéå ââ âå¼çéåâï¼æ²¡æé®ï¼ï¼å®çæ¯ä¸ä¸ªå¼åªè½åºç°ä¸æ¬¡ã
å®çä¸»è¦æ¹æ³å¦ä¸ï¼
new Set(iterable)ââ å建ä¸ä¸ªsetï¼å¦ææä¾äºä¸ä¸ªiterable对象ï¼éå¸¸æ¯æ°ç»ï¼ï¼å°ä¼ä»æ°ç»éé¢å¤å¶å¼å°setä¸ãset.add(value)ââ æ·»å ä¸ä¸ªå¼ï¼è¿å set æ¬èº«set.delete(value)ââ å é¤å¼ï¼å¦ævalueå¨è¿ä¸ªæ¹æ³è°ç¨çæ¶ååå¨åè¿åtrueï¼å¦åè¿åfalseãset.has(value)ââ 妿valueå¨ set ä¸ï¼è¿åtrueï¼å¦åè¿åfalseãset.clear()ââ æ¸ 空 setãset.sizeââ è¿åå ç´ ä¸ªæ°ã
å®ç主è¦ç¹ç¹æ¯ï¼éå¤ä½¿ç¨åä¸ä¸ªå¼è°ç¨ set.add(value) å¹¶ä¸ä¼åçä»ä¹æ¹åãè¿å°±æ¯ Set éé¢çæ¯ä¸ä¸ªå¼åªåºç°ä¸æ¬¡çåå ã
ä¾å¦ï¼æä»¬æå®¢äººæ¥è®¿ï¼æä»¬æ³è®°ä½ä»ä»¬æ¯ä¸ä¸ªäººã使¯å·²ç»æ¥è®¿è¿çå®¢äººåæ¬¡æ¥è®¿ï¼ä¸åºé æéå¤è®°å½ãæ¯ä¸ªè®¿å®¢å¿ é¡»åªè¢«â计æ°â䏿¬¡ã
Set å¯ä»¥å¸®å©æä»¬è§£å³è¿ä¸ªé®é¢ï¼
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
// visitsï¼ä¸äºè®¿å®¢æ¥è®¿å¥½å 次
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);
// set åªä¿çä¸éå¤çå¼
alert( set.size ); // 3
for (let user of set) {
alert(user.name); // Johnï¼ç¶å Pete å Maryï¼
}
Set çæ¿ä»£æ¹æ³å¯ä»¥æ¯ä¸ä¸ªç¨æ·æ°ç»ï¼ç¨ arr.find 卿¯æ¬¡æå
¥å¼æ¶æ£æ¥æ¯å¦éå¤ã使¯è¿æ ·æ§è½ä¼å¾å·®ï¼å 为è¿ä¸ªæ¹æ³ä¼éåæ´ä¸ªæ°ç»æ¥æ£æ¥æ¯ä¸ªå
ç´ ãSet å
é¨å¯¹å¯ä¸æ§æ£æ¥è¿è¡äºæ´å¥½çä¼åã
Set è¿ä»£ï¼iterationï¼
æä»¬å¯ä»¥ä½¿ç¨ for..of æ forEach æ¥éå Setï¼
let set = new Set(["oranges", "apples", "bananas"]);
for (let value of set) alert(value);
// ä¸ forEach ç¸åï¼
set.forEach((value, valueAgain, set) => {
alert(value);
});
注æä¸ä»¶æè¶£çäºå¿ãforEach çåè°å½æ°æä¸ä¸ªåæ°ï¼ä¸ä¸ª valueï¼ç¶åæ¯ åä¸ä¸ªå¼ valueAgainï¼æåæ¯ç®æ å¯¹è±¡ãæ²¡éï¼åä¸ä¸ªå¼å¨åæ°éåºç°äºä¸¤æ¬¡ã
forEach çåè°å½æ°æä¸ä¸ªåæ°ï¼æ¯ä¸ºäºä¸ Map å
¼å®¹ãå½ç¶ï¼è¿çèµ·æ¥ç¡®å®æäºå¥æªã使¯è¿å¯¹å¨ç¹å®æ
åµä¸è½»æ¾å°ç¨ Set ä»£æ¿ Map 徿叮å©ï¼åä¹äº¦ç¶ã
Map ä¸ç¨äºè¿ä»£çæ¹æ³å¨ Set ä¸ä¹åæ ·æ¯æï¼
set.keys()ââ éåå¹¶è¿åä¸ä¸ªå 嫿æå¼çå¯è¿ä»£å¯¹è±¡ï¼set.values()ââ ä¸set.keys()ä½ç¨ç¸åï¼è¿æ¯ä¸ºäºå ¼å®¹Mapï¼set.entries()ââ éåå¹¶è¿åä¸ä¸ªå 嫿æçå®ä½[value, value]çå¯è¿ä»£å¯¹è±¡ï¼å®çåå¨ä¹æ¯ä¸ºäºå ¼å®¹Mapã
æ»ç»
Map ââ æ¯ä¸ä¸ªå¸¦é®çæ°æ®é¡¹çéåã
æ¹æ³å屿§å¦ä¸ï¼
new Map([iterable])ââ å建 mapï¼å¯éæ©å¸¦æ[key,value]对çiterableï¼ä¾å¦æ°ç»ï¼æ¥è¿è¡åå§åãmap.set(key, value)ââ æ ¹æ®é®åå¨å¼ï¼è¿å map èªèº«ãmap.get(key)ââ æ ¹æ®é®æ¥è¿åå¼ï¼å¦æmapä¸ä¸åå¨å¯¹åºçkeyï¼åè¿åundefinedãmap.has(key)ââ 妿keyåå¨åè¿åtrueï¼å¦åè¿åfalseãmap.delete(key)ââ å 餿å®é®å¯¹åºçå¼ï¼å¦æå¨è°ç¨æ¶keyåå¨ï¼åè¿åtrueï¼å¦åè¿åfalseãmap.clear()ââ æ¸ 空 map ãmap.sizeââ è¿åå½åå ç´ ä¸ªæ°ã
䏿®é对象 Object çä¸åç¹ï¼
- ä»»ä½é®ã对象é½å¯ä»¥ä½ä¸ºé®ã
- æå
¶ä»çä¾¿æ·æ¹æ³ï¼å¦
size屿§ã
Set ââ æ¯ä¸ç»å¯ä¸å¼çéåã
æ¹æ³å屿§ï¼
new Set([iterable])ââ å建 setï¼å¯éæ©å¸¦æiterableï¼ä¾å¦æ°ç»ï¼æ¥è¿è¡åå§åãset.add(value)ââ æ·»å ä¸ä¸ªå¼ï¼å¦ævalueåå¨åä¸åä»»ä½ä¿®æ¹ï¼ï¼è¿å set æ¬èº«ãset.delete(value)ââ å é¤å¼ï¼å¦ævalueå¨è¿ä¸ªæ¹æ³è°ç¨çæ¶ååå¨åè¿åtrueï¼å¦åè¿åfalseãset.has(value)ââ 妿valueå¨ set ä¸ï¼è¿åtrueï¼å¦åè¿åfalseãset.clear()ââ æ¸ 空 setãset.sizeââ å ç´ ç个æ°ã
å¨ Map å Set ä¸è¿ä»£æ»æ¯æç
§å¼æå
¥ç顺åºè¿è¡çï¼æä»¥æä»¬ä¸è½è¯´è¿äºé忝æ åºçï¼ä½æ¯æä»¬ä¸è½å¯¹å
ç´ è¿è¡éæ°æåºï¼ä¹ä¸è½ç´æ¥æå
¶ç¼å·æ¥è·åå
ç´ ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼