// Map 是一个带键的数据项的集合,就像一个Object一样。但是最大的区别是Map允许任何类型的键
let map = new Map()
// 一、Map的实例方法
// ①、map.size 返回当前元素个数
// ②、map.set(key,value) 根据键存储值,返回的是map结构本身,可以链式调用
map.set('name','iu') // 字符串类型的键
map.set('name','lisa') // 重复声明,后面的会覆盖前面的
map.set(1,'iu') // 数字类型的键
map.set(true,'boolean') // 布尔值类型的键
// ③、map.get(key) 根据键来返回值,如果map中不存在对应的key,则返回 undefined
console.log(map.get('name')) // lisa
// ④、map.has(key) 如果key存在,则返回true,如果不存在则返回false
console.log(map.has('name')) // true
// ⑤、map.delete 删除map对象中对应的key,返回一个布尔值表示是否删除成功
console.log(map.delete(1),'--->delete') // true
// ⑥、map.clear() 清空map,没有返回值
map.clear()
// 注: Map的键的比较方法类似于严格相等,且Map的对象键只是单纯的引用
console.log(map)
console.log(map.size)
// 二、Map的遍历方法 (Map的遍历顺序就是值的插入顺序)
let map1 = new Map()
map1.set('name','iu')
map1.set('age',17)
map1.set('isGender',false)
// ①、map.keys 返回键
for(let val of map1.keys()) {
console.log(val) // name age isGender
}
// ②、map.values 返回键的值
for(let val of map1.values()) {
console.log(val) // iu 17 false
}
// ③、map.entries 返回一个由键值对组成的数组
for(let val of map1.entries()) {
console.log(val) // ['name','iu'] ['age',17] ['isGender',false]
}
// ④、foreach 遍历
map1.forEach( (item,index)=>{
console.log(index,item) // name,iu age,17 isGender,false
})
console.log(map1.size)
// 三、map与其他结构的互相转换
// ①、Map转为数组 通过扩展运算符
let mapArr = new Map().set('name','iu').set(true,7)
console.log([...mapArr]) // [["name","iu"],[true,7]]
// ②、数组转为Map 在创建Map实例的时候,将数组作为参数传入即可生成Map
console.log(new Map([[1,2],[true,999]])) // Map(2) {1 => 2, true => 999}
// ③、Map转为对象 Object.fromEntries(map)
// 方法一、
// function strMapToObj(strMap) {
// let obj = Object.create(null); // 创建一个没有 __proto__ 的空对象
// for (let [k,v] of strMap) {
// obj[k] = v;
// }
// return obj;
// }
// 方法二、 Object.fromEntries(map)
console.log(Object.fromEntries([ ['name','lisa'],[1,1] ])) // {"1":1,"name":"lisa"}
// ④、对象转为Map Object.entries(object)
console.log(Object.entries({"name":'lisa',age:13})) // [["name","lisa"],["age",13]]
// ⑤、Map转为 JSON格式数据
// 当Map的键都是字符串时,转为对象类JSON
function strMapToJson(strMap) {
// 先通过Object.fromEntries(map)将Map转为对象,再通过JSON.stringify将对象转为JSON字符串
return JSON.stringify(Object.fromEntries(strMap));
}
let myMap = new Map().set('yes', true).set('no', false);
console.log(strMapToJson(myMap)) // {"yes":true,"no":false}
// 当Map的键含有其他类型的数据时,需要转为数组类JSON
function mapToArrayJson(map) {
return JSON.stringify([...map])
}
let myMap1 = new Map().set(true,1).set(1,2)
console.log(mapToArrayJson(myMap1)) // [[true,1],[1,2]]
// ⑥、JSON格式数据转为Map(正常情况下JSON格式数据都是字符串)
// 先用 JSON.parse()将JSON字符串转为对象,再通过Object.entries将对象转为Map
console.log(Object.entries(JSON.parse('{"name":"yoona","age":"13"}'))) // [["name","yoona"],["age","13"]]
console