回憶一下
在es5中常用的數(shù)據(jù)結(jié)構(gòu)是array和json obj,在es6中,出現(xiàn)了兩種新的數(shù)據(jù)類(lèi)型set和map,其實(shí)還有一種weakset,但是用處不大,就不多解釋了。
set是類(lèi)似于數(shù)組的一種數(shù)據(jù)解構(gòu),但是它里面的值不能有重復(fù)的,也不能通過(guò)下標(biāo)訪問(wèn);
我感覺(jué)這個(gè)東西只有一個(gè)作用,就是給數(shù)組排重。
(其實(shí)除了set以外 還有另一個(gè)weakset是用來(lái)專(zhuān)門(mén)存對(duì)象的,但是他不能遍歷十分致命,所以現(xiàn)在都是用map。)
請(qǐng)看例子
let set = new Set([1, 2, 3, 4, 4]);
let arr=["a","b","c","d","a"]
let setarr=new Set();
arr.forEach(x=>setarr.add(x))
console.log(setarr[0]); //undefined set數(shù)組沒(méi)有下標(biāo)
for(let i of setarr){
console.log(i);
}
重點(diǎn):map結(jié)構(gòu),類(lèi)似于json obj也是名值對(duì),不過(guò)他里面的內(nèi)容是不能重復(fù)的,他的名可以是任何東西。
map比較json obj最大優(yōu)勢(shì)在于,第一,key可以是任意類(lèi)型,第二,通過(guò)key方法或者values一次拿到所有鍵值和鍵名,第三,直接能通過(guò)forEach遍歷,而不用再通過(guò)for。第四,直接通過(guò)[...maparr]轉(zhuǎn)化為數(shù)組。它本身是一種更像hash結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)。
缺點(diǎn):map本身不是線性的,他不能通過(guò)下標(biāo)訪問(wèn)。雖然他遍歷起來(lái)很方便。。
在es5中也可以使用Object.keys來(lái)獲取所有的key,但是方法十分的匱乏,es6直接提供 keys()/values()/entries()/forEach()方法,非常強(qiáng)大。
//map的key 可以是Nan,布爾值,字符串,對(duì)象和各種東西,在json中key只能是字符串
//他不能通過(guò)下標(biāo)訪問(wèn),因?yàn)樗旧硪膊皇蔷€性的
let map = new Map([
["name",[1,2,3]],
[true,123],
]);
map.set(true,889) //他的Key是不能重復(fù)的 你再次設(shè)置會(huì)覆蓋里面第一個(gè)true的值
console.log(map);

從這個(gè)例子中能看到,雖然我后面重新set了一個(gè)值,但是并不會(huì)在里面新增一個(gè),而是對(duì)原來(lái)的內(nèi)容進(jìn)行賦值。
關(guān)鍵問(wèn)題:深入map數(shù)據(jù)結(jié)構(gòu)
// map和set數(shù)據(jù)結(jié)構(gòu)常用的方法有 set或add添加 / has 查找 / clear 清空
// 在map中通過(guò)get(key)來(lái)獲得值
// 只有key是不能重復(fù)的 val怎么重復(fù)都無(wú)所謂
let map = new Map([
["man",[["name","laodang"],["name","laozhang"]]],
["reg",25]
]);
// let[key,val] of map 都可以獲取到值
for(let[key,val] of map.get("man")){
console.log(key);
console.log(val);
}
解構(gòu)和排序 從map中獲取來(lái)的已經(jīng)是數(shù)組了,直接通過(guò)sort排序即可,簡(jiǎn)直爽炸天。
// 排序,一般情況下不需要對(duì)key排序
let map = new Map([
["people",
[{"name":"laodang","age":"30"},
{"name":"laowang","age":"28"},
{"name":"laohe","age":"25"}]
],
]);
console.log(map.get("people"));
//排序
map.get("people").sort((a,b)=>{
return a.age-b.age
})
//查看排序后的數(shù)組
console.log(map.get("people"));
// 數(shù)據(jù)解構(gòu) 結(jié)構(gòu)數(shù)據(jù)name,age 要跟對(duì)象中的一致
for(let {name,age} of map.get("people")){
console.log(age);
}