45 Map数据结构
45.1 Map的基本用法
键名必须数据类型和值一模一样
1.Object 字符串-值
2.Map 值-值 hash结构 key:value
对象的好处是独一无二 创建后的地址不一样
let s=new Set();
let s=new Set(); //value只能出现一次
s.add()
let m=new Map();
m.set(o,"aabbcc");
m.get(o) //aabbcc
let o={
x:1,
y:2
}
let m=new Map([ //key只能出现一次 要用对象来设键名的时候,一定要在外面设变量
[
[o,"aabbcc"],
[9582,"dsaf"],
[undefined,"csdf"]
]
]);
Map的键名是内存中间的一段数据,数据+下一个数据的地址**,线性链式存储结构
数据结构:线性结构和非线性结构
1.Map的属性与方法
属性
map.set(key,value)
map.set(key,value)
get(key)
has(key)
delete(key)
clear()
方法
keys()
for( let key of map.key()){
console.log(key)
}
value()
for( let value of map.value()){
console.log(value)
}
entries() 键值对
for( let [key,value] of map.entries()){
console.log(key,value)
}
forEach()
for( let entries of map){
console.log(entries)
}
45.2 Map的数据结构的转换
map结构转换为数组结构,比较快速的方法是使用扩展运算符(…)。例子↓:
强烈建议以后对象转数组都用[… 方法]
[...map.keys()]
[...map.values()]
[...map.entries()]
[...map]
[...map].filter(([key,value])=>key<3)
转换后可以用array的filter
map和数组的转换
!一定要二维数组的结构
1.map转为数组
const myMap=new Map();
.set('yes',true);
.set('no',false);
[...myMap] //(2) [Array(2), Array(2)]
//0: (2) ["yes", true]
//1: (2) ["no", false]
//length: 2
2.数组转为map
new Map([
[true,7],
[{foo:3},['abc']]
]) //Map(2) {true => 7, {…} => Array(1)}
map和对象切换
1.map转为对象
function strMapToObj(strMap){
let obj=Object.create(null);
for(let [k,v]of strMap){
obj[k]=v;
}
return obj;
}
const myMap=new Map();
.set('yes',true); //键值需为字符串
.set('no',false);
strMapToObj(myMap); //{yes: true, no: false}
2.对象转为Map
function objToStrMap(obj){
let strMap =new Map();
for(let k of Object.keys(obj)){
strMap.set(k,obj[k]);
}
return strMap;
}
objToStrMap({yes:true,no:false}) //Map(2) {"yes" => true, "no" => false}
45.3 WeakMap数据类型与应用
1.weakmap只接受对象作为键名(null除外
2.weakMap键名指向的对象,不计入垃圾回收机制(不算是引用
所以,假如不引用了,就立马消失,
应用场合:键所对应的对象可能会在将来消失。防止内存泄露 雨滴滴落
has()
get()
has()
delete()