ES6 Map和Set
2021-10-05 本文已影响0人
微语博客
Map
Map是一个使用键值对存储数据的数据结构,类似Object对象,但是区别于对象的是:Map的键可以是任意类型,包括对象且为有序的,而对象的键只能是字符串或者Symbol类型而且无序;Map是迭代对象,很容易遍历,而对象则不可迭代,而且每个对象都有自己的原型,键可能存在冲突。
Map中的key:
key为字符串
let map = new Map();
map.set("myKey","myValue");
console.log(map.get("myKey"));//myValue
key是对象
let map = new Map();
let obj = {};
map.set(obj,"myValue");
console.log(obj);//myVaule
这里需要注意的是:虽然obj是个空对象,但是对象是引用类型,所以不能用{}代替obj作为键,但是字符串可以。
Map迭代
Map可以使用for of或者forEach遍历。
for of 以数组的方式将值输出
let map = new Map();
map.set("key1","vaule1");
map.set("key2","vaule2");
for(let [key,value] of map){
console.log(key+"---"+value);
}
for(let [key,value] of map.entries()){
console.log(key+"---"+value);
}
//entries 方法返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组。
forEach
let map = new Map();
map.set("key1","vaule1");
map.set("key2","vaule2");
map.forEach(function(value, key) {
console.log(key + " --- " + value);
}, map)
keys 和 values
let map = new Map();
map.set("key1","vaule1");
map.set("key2","vaule2");
for(let key of map.keys()){
console.log(key);
}
for(let value of map.values()){
console.log(value);
}
keys()和values()方法返回两个新的迭代器,可用于遍历键和值。
Map对象的操作
Map与Array互转
let map = new Map([["key1","value1"],["key1","value1"]]);//键值对的数组转Map
let arr = Array.from(map);//Map转数组
Map克隆
let map1 = new Map([["key1","value1"],["key1","value1"]]);
let map2 = new Map(map1);
console.log(map1 === map2);//false
Map合并
let map1 = new Map();
let map2 = new Map();
let map3 = new Map([...map1,...map2]);
如果有重复的键,则后面的会覆盖前面的值。
Set
set是可存储任意数据的集合,且唯一不重复。但是有几个值例外:undefined, +0, -0,它们自身恒等,不可以同时存在集合中,但是NaN虽然不等,却只能有一个。
let set = new Set();
set.add(undefined);
set.add(undefined);
set.add(+0);
set.add(-0);
set.add(NaN);
set.add(NaN);
console.log(set.size);
Set和数组
set和数组的互转
let set = new Set([1,2,3]);//数组转集合
let arr = [...set];//集合转数组
因为集合的唯一性,所以数组转集合再转回数组的过程可以实现数组去重,但是要考虑几个特殊值的情况。
求并集
let set1 = new Set(1,2,3);
let set2 = new Set(2,3,4);
let set3 = new Set([...set1,...set2]);//1,2,3,4
求交集
let set1 = new Set(1,2,3);
let set2 = new Set(2,3,4);
let set3 = new Set([...set1].filter(x => set2.has(x)));//2,3
求差集
let set1 = new Set(1,2,3);
let set2 = new Set(2,3,4);
let set3 = new Set([...set1].filter(x => !set2.has(x)));//1