ES6 Map集合
JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串=>值”的对应,Map结构提供了“值=>值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
ES6中的Map 类型是键值对的有序集合,和Object 类型最大的不同点是:Map 集合的键名和对应的值支持所有的数据类型,而Object 类型只能用字符串当作键名。
map里面的参数必须是一个可迭代对象,
//Object 类型
//数值2被自动转为字符串
let obj = {
2: 2,
"2": 2
}
console.log(Object.keys(obj).length);
//普通的对象如果属性名一样,会直接覆盖
//输出:1
//Map 类型
let map = new Map([
[2, 2],
["2", 2],
[{}, {}]
]);
console.log(map.size);
//输出:3
Map的方法
set(key, value)
set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
let m = new Map(); //set方法添加
//添加一个string类型的键名
m.set("name","张三");
//添加一个数字类型的键名
m.set(1,2);
//打印结果:Map {"name" => "张三", 1 => 2}
//set方法的使用很简单,只需要给方法传入key和value作为键名和键值即可。
//注意:第三行代码中,我们传入的key是数字1,这就证明了,
//Map结构确实可以存储非字符串类型的键名,当然你还可以设置更多其它类型的键名,
//比如:
m.set([1],2); //数组类型的键名
m.set({"name":"Zhangsan"},2); //对象类型的键名
m.set(true,2); //布尔类型的键名
m.set(Symbol('name'),2); //Symbol类型的键名
m.set(null,2); //null为键名
m.set(undefined,2);//undefined为键名
get( )方法
get( )方法作用:获取指定键名的键值,返回键值。
let m = new Map([["name","张三"]]);
m.get("name");//张三
m.get("gender");//undefined
//get方法使用也很简单,只需要指定键名即可。
//获取存在对应的键值,如果键值对存在,就会返回键值;
// 否则,返回undefined,这个也很好理解。
delete( )方法
delete( )方法作用:删除指定的键值对,删除成功返回:true,否则返回:false。
let m = new Map();
m.set("name","张三"); //Map {"name" => "张三"}
m.delete("name");//true
m.delete("gender");//false
clear( )方法
跟Set结构一样,Map结构也提供了clear( )方法,让你一次性删除所有键值对。
let m = new Map();
m.set("name","张三");
m.set("gender",1);
m.clear();
console.log(m); //打印结果:Map {}
//使用clear方法后,我们再打印一下变量m,发现什么都没有,一个空的Map结构,说明clear方法起作用了。
has( )方法
has( )方法作用:判断Map实例内是否含有指定的键值对,有就返回:true,否则返回:false。
let m = new Map();
m.set("name","张三");
m.has('name');//结果:true
m.has('age');//结果:false
//Map实例中含有键名:name,就返回了true,键名age不存在,就返回false。
Map遍历方法
Map结构原生提供三个遍历器生成函数和一个遍历方法;
我们可以使用ES6的新特性for…of来遍历它的键名或者键值。
keys():返回键名的遍历器
values():返回键值的遍历器
et m = new Map([
["name","张三"],
["age",25]
]); //使用keys方法获取键名
for(let key of m.keys()){
console.log(key);
} //name
// age
//使用values方法获取键值
for(let value of m.values()){
console.log(value);
}
//张三
//25
entries():返回所有成员的遍历器
let m = new Map([
["name","张三"],
["age",25]
]);
for(let [key,value] of m.entries()){
console.log(key+' '+value);
}
//name 张三
//age 25
forEach():遍历Map的所有成员
let m = new Map([
["name","张三"],
["age",25]
]);
m.forEach(function(value,key){
console.log(key+':'+value);
});
//name:张三
//age:25
//forEach方法接收一个匿名函数,给匿名函数传参value和key,分别是Map实例的键名和键值
Map结构转为数组结构
const map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
[...map.keys()]
// [1, 2, 3]
[...map.values()]
// ['one', 'two', 'three']
[...map.entries()]
// [[1,'one'], [2, 'two'], [3, 'three']]
[...map]
// [[1,'one'], [2, 'two'], [3, 'three']]