ECMAScript 6中的Set 集合
EcmAScript 6中新增了Set类型是一种有序列表,其中含有一些相互独立的非重复值,通过Set集合可以快速访问其中的数据,更有效地追踪各种离散值
创建Set集合并添加元素
调用new Set()创建Set集合,调用add()方法向集合中添加元素,访问集合
sizes属性可以获取集合中目前的元素数量。
let set=new Set();
set.add(1);
set.add(2);
console.log(set.size);//2打印set集合的长度
在Set集合中的+0和-0被认为是相等的。当然,如果向Set集合中添加多个对象,
则它们之间彼此保持独立:
let set=new Set();//创建一个set集合
let key={};
let key2={};
set.add(key);
set.add(key2);
console.log(set.size);//2
由于key和key2不会被转换为字符串,因此他们的Set集合是两个独立的元素;如果
被转换,则二者的值都是“【object Object】”。
如果多次调用add()方法并传入相同的值作为参数,那么后续的调用实际上
会被忽略:
let set=new Set();
set.add(5);
set.add("5");
set.add(5);
console.log(set.size);//2重复的被忽略的
由于第二次传入的数字5是一个采重复值,因此其不会被添加到集合中,所以
console.log()最后输出的Set集合的属性值为2,。也可以用到数组的去重,Set
构造函数同样会过滤掉重复的值从而保证集合的元素各自唯一。
let set=new Set([1,2,3,4,5,5,5,5]);//可以接受一个数组为参数
console.log(set.size);//5
注意:实际上,Set构造函数可以接收所有可迭代对象作为参数,数组,Set
集合,Map集合都是可以迭代的,因而都可以作为Set构造函数的参数使用;
构造函数通过迭代器从参数中提取值。
Set里面通过has()方法可以检测Set集合是否存在某个值:
let set=new Set();
set.add(5);
set.add("5");
console.log(set.has(5))//true;
console.log(set.has("5"))//true;
console.log(set.has(6))//因为集合里面没有6所以返回false
移除元素
调用delete()方法可以移除Set集合中的某一个元素,调用clear()方法会移
除集合的所有元素。请看下面的代码:
let set=new Set();
set.add(5);
set.add("5");
console.log(set.has(5))//true;
set.delete(5);
console.log(set.has(5));//false
console.log(set.size);//1
set.clear();
console.log(set.has("5"))//false
console.log(set.size);//0
Set集合的forEach()方法
如果你曾经使用过数组,可能已经非常熟悉数组的forEach()方法,ECMAScript5中的这个标准可以简化数组遍历过程,不用再编写循环语句。后来被证实此方法在开发之间非常流行,所以ECMAScript6也为集合Set添加了同样的方法,其使用方法也非常类似。
forEach()方法的回调函数可以接收以下3个参数:
- Set集合item值也可以说成(项)
- 与第一个参数一样的值(set里面就这点特殊)
- 被遍历Set集合的本身
let set=new Set([1,2,3,4]);
set.forEach((item,key,arr)=>{
console.log(item+"=>"+key);//这俩值也一直一样
console.log(set==arr)//一直为true
})
Set集合版的数组去重(利用展开运算符(…))
let arr=[1,1,3,1,2,3,2,2];
let set=new Set(arr);//Set构造函数可以传数组这样就变成set集合了
let newarr=[...set]//利用展开运算符展开set集合,放到数组里面,
console.log(newarr)//利用Set集合唯一性的特点完成简单数组去重[1,3,2]
ECMAScript 6中的Map集合
ECMAScript 6中的Map类型是一种储存着许多键值对的有序列表,其中的键名和
对应的值支持所有的数据类型。键名的等价性判断是通过调用Objiect.is()方法
实现的,所有数字5与字符串“5”会被判定为两种类型,可以分别作为独立的两
个键出现在程序中,这一点与对象中不太一样,因为对象的属性名终会被强制转
成字符串类型。
如果要向Map集合中添加新的元素,可以调用set()方法并分别存入键名
和对应值作为两个参数:如果要从集合中获取信息,可以调用get()方法。就
像这样:
let map=new Map();
map.set("title","马帅涛");
map.set("year","2020");
console.log(map.get("title"))//输出马帅涛
console.log(map.get("year"))//输出2020
在对象里面,无法用对象作为对象属性的键名但在Map集合中,却可以这样做:
let map=new Map();//创建一个map集合
let key={};
let key2={};
map.set(key,5);
map.set(key2,7);
console.log(map.get(key))//5
console.log(map.get(key2))//7
Map集合支持的方法
- has(key) 检查指定的键名在Map集合中是否已经存在。
- delete(key) 从Map集合中移除指定键名及其对应的值。
- clear() 移除Map集合中的所有键值对。
- size 属性其代表当前集合中包含的键值对数量。
- clear()方法快速清除全部
let map=new Map();
map.set("name","马帅涛");
map.set("age","20");
console.log(map.size);//2
console.log(map.has('name'))//true
console.log(map.get('name'))//"马帅涛"
console.log(map.has("age"))//true;
console.log(map.get("age"))//20
map.delete("name");
console.log(map.get("name"))//undefined
console.log(map.has("name"))//false
console.log(map.size);//1
map.clear();//清空
console.log(map.has("name"));//false
console.log(map.get("name"))//undefined
console.log(map.has("age"))//false
console.log(map.get("age"))//undefined
console.log(map.size)//0
Map集合的初始化方法
可以向map构造函数传入数组来初始化一个Mao集合,这一点同样与Set集合相似。数组中的每个元素都是一个子数组,子数组中包含一个键值对的键名与键值得两个元素。因此整个Mao集合中包含的全是这样的两个元素数组;
let map=new Map([['name','马帅涛'],['age','20']]);//初始化map方法
console.log(map.has("name"))//true
console.log(map.get('name'))//"马帅涛"
console.log(map.has("age"))//true;
console.log(map.get("age"))//20
console.log(map.size);//2
Map集合的forEach()方法
Map集合的forEach()方法与Set集合和数字的forEach()方法类似,回调函数都接受3个参数;
- Map 集合中的位置(值)
- 值对应的键名
- Map集合本身
let map=new Map([['name','马帅涛'],['age','20']]);//初始化map方法
map.forEach((value,key,arr)=>{
console.log(key+"=>"+value);
console.log(arr==map)//一直相等
})
//输出name=>马帅涛
//ture;
//age=>20
//true;