前置知识: 由于传统的 JavaScript
对象只能用字符串当做键,给开发带来很大限制,ES6增加 Map
数据结构,使得各种类型的值(包括对象)都可以作为键。
Maps 和 Objects 的区别
- 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
- Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
- Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
- Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突
1.常用方法:
add: map对象尾部添加元素
const map1= new Map([1,2,3]); //array转set
map1.add(4); //添加元素
map1.get(4); //查询key值
has: 是否包含某个元素
map1.has(1); //是否有1
clear:清除所有元素
map1.clear(); //清除set1所有内容
delete:删除某个元素
map1.delete(1); //删除1
size :长度
map.size()
2.Map 实例的遍历方法有:
- keys():返回键名的遍历器。
- values():返回键值的遍历器。
- entries():返回所有成员的遍历器。
- forEach():遍历 Map 的所有成员。
数组去重:
const map = new Map();
map.set('aaa', 100);
map.set('bbb', 200);
for (let key of map.keys()) {
console.log(key);
}
// "aaa"
// "bbb"
for (let value of map.values()) {
console.log(value);
}
// 100
// 200
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
// aaa 100
//...
3.Map与其他类型的转换
object转map
const obj = { foo: 'bar', baz: 42 };
const map = new Map(Object.entries(obj));
map // Map { foo: "bar", baz: 42 }
map转对象
function strMapToObj(strMap) {
let obj = Object.create(null);
for (let [k,v] of strMap) {
obj[k] = v;
}
return obj;
}
const myMap = new Map()
myMap.set('yes', true)
myMap.set('no', false);
let obj = strMapToObj(myMap)
map转数组
const map = new Map();
map.set(1,"foo").set(2,"bar").set(3,"baz");
const arr = [...map];
console.log(arr);
数组转map
const arr = ["foo","bar","baz"];
const arrChangeMap = (arr) => new Map(arr.map( (value,key) => [key,value]));
console.log(arrChangeMap(arr));