Set类似数组,只有value,成员唯一,无重复,本质构造函数
通过new实例化Set实例
参数:数组(或有iterable接口的数据结构)
字符串、数组、对象、Set、Map、arguments、元素集合(DOM)
let set=new Set('hello');
console.log(set);
属性:
size:
成员总数
实例方法:
add()
:添加某个值,返回新的Set
delete()
:删除某个值,返回布尔值
has()
:判断实例中是否有某个值,返回布尔值
clear()
:清空所有成员
let set=new Set();
set.add(1);
set.add(NaN).add(NaN);
console.log(set);
set.has(1);
set.delete(1);
set.has(1);
set.clear();
遍历方法:
Set的默认遍历器生成函数Symbol.iterator
是f values
for(let i of new Set(['a','b','c'])){
//由于默认的遍历器生成函数是values 后台打印的是键值
console.log(i);
}
entries()
遍历返回值,得到的是 两个相同的value组成的数组
values()
获取所有的value
keys()
获取所有的value
let set=new Set(['a','b','c']);
for(let key of set.keys()){
console.log(key);
}
for(let value of set.values()){
console.log(value);
}
for(let [key,value] of set.entries()){
console.log('键:'+key+','+'值:'+value);
}
forEach() :遍历所有的键值,参数是回调函数可以有三个参数,参数1:当前对象的键,参数2:当前对象的值
let set=new Set(['a','b','c']);
set.forEach((key,value)=>{
console.log("键:"+key);
console.log("值:"+value);
})
数组去重:
let arr1=[1,2,34,56],arr2=[2,4,5,9,34];
let arr=[...new Set([...arr1,...arr2])];
//或者是下面
//let arr=Array.from(new Set[...arr1,..arr2]);
将Set数据结构转成数组:
扩展运算符:[..new Set().]
Array.from(new Set())
数组的map()、filter()方法也可以用在Set结构上
let set=new Set([1,2,3,4,5,6,7,8,9]);
console.log(set.size);
//将set中的值 乘以2之后返回组成一个新的Set
let set1=new Set([...set].map(x=>x*2));
console.log(set1);
//将set中的值 过滤掉小于等于2的 留下大于2的 组成新的Set
let set2=new Set([...set].filter(x=>x>2));
console.log(set2);
Map数据结构,key可以是任何类型,值-值
参数:数组,每个成员是双元素数组
let item=[['day',"星期一"],['day2','星期二'],['day3','星期三'],['day4','星期四'],['day5','星期五']];
//其中key每个数组的索引为0的键值,value是索引为1的键值
let map=new Map(item);
同一个键多次声明,后面的覆盖前面的值
set(key,value)
:给Map实例设置键值对
get(key)
:获取对象的键值对
has(key)
:返回布尔值,判断是否有key对应的value值
delete(key)
:返回布尔值,显示是否删除key对应的成员
clear()
:清空所有成员
//实例化Map
let map=new Map();
//给map中添加key=1,value=2的成员
map.set(1,2);
//给map中添加key=2,value=3的成员
map.set(2,3);
//给map中添加key=1,value=3的成员
map.set(1,3);
map.set(['a','b'],3);
console.log(map);
//判断key=1的成员是否存在
map.has(1);
//删除key=1对应成员
map.delete(1);
//判断key=1的成员是否存在
map.has(1);
//获取key=1的成员
map.get(2);
//清空map中所有成员
map.clear();
循环遍历:
Map结构默认的遍历器函数
是 f entries
for(let map of new Map([[1,2],[2,3],[3,4]])){
//循环遍历 遍历器中的成员
console.log(map);
}
values()
keys()
entries()
forEach()
let map=new Map([['a',2],['b',3],['c',5]]);
for(let key of map.keys()){
console.log(key);
}
for(let value of map.values()){
console.log(value);
}
for(let entry of map.entries()){
console.log(entry);
}
数组转成Map
- 数组传入Map中
let arr=[[1,2],[3,4]];
console.log(new Map(arr));
- 遍历数组添加键值对
let arr=[1,2,3,4,5];
let map=new Map();
for(let i of arr){
map.set(i,arr[i]);
}
console.log(map);
Map转成数组
- 扩展运算符:
let map=new Map([[1,2],[3,4]]);
let arr=[...map];
console.log(arr);
- Array.from()
let map=new Map([[1,2],[3,4]]);
let arr=Array.from(map,x=>x*2);
console.log(arr);
对象与Map间的互换和数组与Map间的互换类似
对象转成Map
let obj={'a':1,'b':2},map=new Map();
for(let [key,value] of Object.entries(obj)){
map.set(key,value);
}
console.log(map);
Map转成对象
function mapToObject(map){
//创建原型为空的对象,也就是不继承原型
let obj=Object.create(null);
for(let [key,value] of map.entries()){
obj[key]=value;
}
return obj;
}
let map=new Map([[1,2],[3,4]]);
mapToObject(map);