- 2019-01-10 创建
Map 属性
size返回Map结构的成员个数
Map方法
1. set(key, value)
设置key所对应的键值,然后返回整个Map结构,如果key的值存在,就更新,否则生成新的键值。
因为他返回的是Map本身,所以可以采用链式写法
let map = new Map().set(1, 'a').set(2, 'b').set(3, 'c');
console.log(map.size); // 3
扩展:
链式调用的原理——执行完一个方法之后返回本身,然后被返回的对象继续执行后面的方法
2. get(key):读取key对应的value,如果没有,返回undefined
3. has(key):返回布尔值,某个键是否存在于Map结构中
4. delete(key):删除某个键,返回true,如果删除失败,返回false
5. clear()方法清除所有成员,没有返回值
let map = new Map().set(1, 'a').set(2, 'b').set(3, 'c');
console.log(map.size); // 3
map.clear();
console.log(map.size); // 0
遍历方法
1. keys(): 键的遍历
2. values(): 值的遍历
3. entries(): 键值对的遍历
4. let ... of [...]: 使用回调函数遍历每个成员
let map = new Map([[1,1],[2,3]]); // Map只可以接受数组作为参数(二维),Set只接受数组做参数(一维)
for(let i of map.keys()){
console.log(i); // 1 2
}
for(let i of map.values()){
console.log(i); // 1 3
}
for(let i of map.entries()){
console.log(i[0],i[1]); // 1 1 2 3
}
for(let i of map){
console.log(i[0],i[1]); // 1 1 2 3
}
从上面的例子可以看出:Map默认的遍历方式是key--value。Set默认的遍历方式是value
数据结构转换
1. Map结构转化为数组结构方法——扩展运算符
let map = new Map([[1,1],[2,3]]);
console.log([...map.keys()]); // [1,2]
console.log([...map.values()]); // [1,3]
console.log([...map.entries()]);// [[1,1],[2,3]]
console.log([...map]); // [[1,1],[2,3]]
2. 数组转换为Map结构——将数组传入Map构造函数
let map = new Map([[1,1],[2,3]]);
console.log(map); // Map(2) {1 => 1, 2 => 3}
3. Map转为对象——如果Map的所有键都是字符串,才可以将其转为对象
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);
console.log(strMapToObj(myMap));
// { yes: true, no: false }
4. 对象转为Map
function objToStrMap(obj) {
let strMap = new Map();
for (let k of Object.keys(obj)) {
strMap.set(k, obj[k]);
}
return strMap;
}
var a = {yes: true, no: false}
console.log(objToStrMap(a))
// [ [ 'yes', true ], [ 'no', false ] ]
Map转为JSON
json 对象
function strMapToObj(strMap) {
let obj = Object.create(null);
for (let [k,v] of strMap) {
obj[k] = v;
}
return obj;
}
function strMapToJson(strMap1) {
return JSON.stringify(strMapToObj(strMap1));
}
let myMap2 = new Map().set('yes', true).set('no', false);
console.log(strMapToJson(myMap2));
// '{"yes":true,"no":false}'
json 数组
function mapToArrayJson(map) {
return JSON.stringify([...map]);
}
let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);
mapToArrayJson(myMap)
console.log(mapToArrayJson(myMap))
// '[[true,7],[{"foo":3},["abc"]]]'
6. JSON转为Map——正常情况下所有键名都是字符串
json对象
function objToStrMap(obj) {
let strMap = new Map();
for (let k of Object.keys(obj)) {
strMap.set(k, obj[k]);
}
return strMap;
}
function jsonToStrMap(jsonStr) {
return objToStrMap(JSON.parse(jsonStr));
}
jsonToStrMap('{"yes":true,"no":false}')
console.log(jsonToStrMap('{"yes":true,"no":false}'))
// Map {'yes' => true, 'no' => false}
josn 数组
function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
jsonToMap('[[true,7],[{"foo":3},["abc"]]]')
console.log(jsonToMap('[[true,7],[{"foo":3},["abc"]]]'))
// Map {true => 7, Object {foo: 3} => ['abc']}