JavaScript入门教程前端入门教程

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
上一篇下一篇

猜你喜欢

热点阅读