回忆一下
在es5中常用的数据结构是array和json obj,在es6中,出现了两种新的数据类型set和map,其实还有一种weakset,但是用处不大,就不多解释了。
set是类似于数组的一种数据解构,但是它里面的值不能有重复的,也不能通过下标访问;
我感觉这个东西只有一个作用,就是给数组排重。
(其实除了set以外 还有另一个weakset是用来专门存对象的,但是他不能遍历十分致命,所以现在都是用map。)
请看例子
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数组没有下标
for(let i of setarr){
console.log(i);
}
重点:map结构,类似于json obj也是名值对,不过他里面的内容是不能重复的,他的名可以是任何东西。
map比较json obj最大优势在于,第一,key可以是任意类型,第二,通过key方法或者values一次拿到所有键值和键名,第三,直接能通过forEach遍历,而不用再通过for。第四,直接通过[...maparr]转化为数组。它本身是一种更像hash结构的数据结构。
缺点:map本身不是线性的,他不能通过下标访问。虽然他遍历起来很方便。。
在es5中也可以使用Object.keys来获取所有的key,但是方法十分的匮乏,es6直接提供 keys()/values()/entries()/forEach()方法,非常强大。
//map的key 可以是Nan,布尔值,字符串,对象和各种东西,在json中key只能是字符串
//他不能通过下标访问,因为他本身也不是线性的
let map = new Map([
["name",[1,2,3]],
[true,123],
]);
map.set(true,889) //他的Key是不能重复的 你再次设置会覆盖里面第一个true的值
console.log(map);
从这个例子中能看到,虽然我后面重新set了一个值,但是并不会在里面新增一个,而是对原来的内容进行赋值。
关键问题:深入map数据结构
// map和set数据结构常用的方法有 set或add添加 / has 查找 / clear 清空
// 在map中通过get(key)来获得值
// 只有key是不能重复的 val怎么重复都无所谓
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);
}
解构和排序 从map中获取来的已经是数组了,直接通过sort排序即可,简直爽炸天。
// 排序,一般情况下不需要对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
})
//查看排序后的数组
console.log(map.get("people"));
// 数据解构 结构数据name,age 要跟对象中的一致
for(let {name,age} of map.get("people")){
console.log(age);
}