Map
Js中的Object级解,本質(zhì)上是鍵值對的集合,但是只能夠用字符串作為key试伙,為解決這個問題嘁信,因此ES6中提供了Map數(shù)據(jù)結(jié)構(gòu)。
map類似于對象迁霎,也是鍵值對的集合吱抚,但是key不僅僅是字符串,各種類型的值(包括對象)都可以當(dāng)做建考廉。
Object 是“字符串—值”的對應(yīng)秘豹,Map 是“值—值”的對應(yīng),
const m = new Map();
const o = { p: 'hello world'};
m.set(o,'content')
m.get(o);//content
m.has(o)//true
m.delete(o)//true
m.has(o);//false
上面還用set方法將一個對象o作為m的一個鍵昌粤,然后又用get取到o的值然后刪除這個鍵
Map也可以接受一個數(shù)組作為參數(shù)既绕。該數(shù)組的成員是一個個表示鍵值對的數(shù)組
const map = new Map([
['name', '張三'],
['title', 'Author']
]);
map.size // 2
map.has('name') // true
map.get('name') // "張三"
map.has('title') // true
map.get('title') // "Author"
如果對同一個鍵多次賦值,后面的值將覆蓋前面的值涮坐。
如果讀取一個未知的鍵凄贩,則返回undefined。
只有對同一個對象的引用袱讹,Map結(jié)構(gòu)才將其視為同一個鍵疲扎。
var map = new Map();
//表面是針對同一個鍵昵时,但實際上這是兩個值,內(nèi)存地址是不一樣的
map.set(['a'], 555);
map.get(['a']) // undefined
同樣的值的兩個實例椒丧,在Map結(jié)構(gòu)中被視為兩個鍵
//變量k1和k2的值是一樣的壹甥,但是它們在Map結(jié)構(gòu)中被視為兩個鍵
var map = new Map();
var k1 = ['a'];
var k2 = ['a'];
map
.set(k1, 111)
.set(k2, 222);
map.get(k1) // 111
map.get(k2) // 222
由上可知,Map的鍵實際上是跟內(nèi)存地址綁定的壶熏,只要內(nèi)存地址不一樣句柠,就視為兩個鍵。這就解決了同名屬性碰撞的問題棒假。
map.size屬性返回Map結(jié)構(gòu)的成員總數(shù)
set(key, value)方法設(shè)置key
set方法返回的是Map本身溯职,因此可以采用鏈?zhǔn)綄懛ā?br>
get方法讀取key對應(yīng)的鍵值,如果找不到key帽哑,返回undefined谜酒。
has方法返回一個布爾值,表示某個鍵是否在Map數(shù)據(jù)結(jié)構(gòu)中妻枕。
delete方法刪除某個鍵甚带,返回true。如果刪除失敗佳头,返回false鹰贵。
clear方法清除所有成員,沒有返回值康嘉。
Map原生提供三個遍歷器生成函數(shù)和一個遍歷方法碉输。
keys():返回鍵名的遍歷器。
values():返回鍵值的遍歷器亭珍。
entries():返回所有成員的遍歷器敷钾。
forEach():遍歷Map的所有成員。
需要特別注意的是肄梨,Map的遍歷順序就是插入順序阻荒。
Map結(jié)構(gòu)轉(zhuǎn)為數(shù)組結(jié)構(gòu),比較快速的方法是結(jié)合使用擴展運算符(...)众羡。
let map0 = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');
let map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
// 產(chǎn)生Map結(jié)構(gòu) {1 => 'a', 2 => 'b'}
let map2 = new Map(
[...map0].map(([k, v]) => [k * 2, '_' + v])
);
// 產(chǎn)生Map結(jié)構(gòu) {2 => '_a', 4 => '_b', 6 => '_c'}
數(shù)組轉(zhuǎn)為Map
new Map([[true, 7], [{foo: 3}, ['abc']]])
// Map {true => 7, Object {foo: 3} => ['abc']}
Map轉(zhuǎn)為對象
//如果所有Map的鍵都是字符串侨赡,它可以轉(zhuǎn)為對象。
function strMapToObj(strMap) {
let obj = Object.create(null);
for (let [k,v] of strMap) {
obj[k] = v;
}
return obj;
}
let myMap = new Map().set('yes', true).set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }