es6新的数据结构
1.Set:构造函数
const s = new Set ([1,2,3]);console.log(s)//Set(3){1,2,3}; [...s];//[1,2,3] console.log(s);//Set(3){1,2,3}; s.add(4);//Set(4){1,2,3,4}; s.size;//4; s.has(1);//true s.delete(2); s.clear();//Set(0){}
用于数组去重
let arr=[1,2,1];arr = [...Set(arr)]//[1,2] //Set里NaN与NaN相等 let set = new Set(); set.add(NaN); set.add(NaN); set.size//1
Set遍历操作
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历成员
//keys():let set = new Set([11,2,3,4]);for(let item of set.keys()){ console.log(item)}//11,2,3,4//values():for (let val of set.values()){ console.log(val)}//11,2,3,4//entries():for (let item of set.entries()){ console.log(item) }//[11,11];[2,2];....//forEachset.forEach((val)=>{console.log(val)})
还可以使用for... of
for (let val of set){ console.log(val)}
Map:可以使用非字符串作为键
//对象只允许使用字符串作为键;否则var obj={a:1,b:2};var ar={};ar[obj]=2;console.log(ar);//{[object Object]: 2}//Mapconst map=new Map(); map.set(NaN,123); map.get(NaN);//123 //undefined和null不相等map.set(obj,2);//key:{name: "joe", say: ƒ};value:2map.get(obj);//2map.has(obj);/truemap.delete(obj);//truemap.delete(ofo);//报错map.delete(ar);//false map.clear(); map.size//0 //数组生成新的map const mvp = new Map(['name','joe'],['title','silence']); mvp.size;//2 mvp.has('name')//true mvp.get('name')//joe //Set和Map生成新的Map const set = new Set([['foo',1],['bar',2]]); const m1 = new Map(set); m1.get('foo')//1
遍历方法
const map = new Map ([['name','joe'],['say','hello']]);//keys()for (let key of map.keys()){ console.log(key)//name;say}//values()//entries()for (let item of map.entries()){ console.log(item)//会把键和值放在一个数组里}//forEachmap.forEach()
Map转为数组结构
const map=new Map([ [1,'0ne'], [2,'two'], [3,three]])[...map.keys][...map.values][...map.entries][...map)
Map和数组方法
const map0 = new Map() .set(1,'a') .set(2,'b') .set(3,'c');const map1=map0.filter(([key,value])=>{ return key>2})类比使用数组map方法
const map=new Map([['e1','a'],['e2','b']])map.forEach(function(value, key, map) { console.log("Key: %s, Value: %s", key, value);});//Key: e1, Value: a;Key: e2, Value: b
forEach接收第二个参数用来绑定this
const reporter={ report:function(key,value){ console.log("Key:%s,Value:%s",key,value); }}const map=new Map([['e1','a'],['e2','b']]);map.forEach(function(value,key,map){ this.report(key,value)},reporter)//声明一个对象reporter里面包含着对map遍历的变量的处理,在对map进行forEach遍历的时候,传入第二个变量即reporter,可以在forEach函数中使用this.reporter对其中的变+量进行处理
Map转换
//Map转为数组const map= new Map() .set('e1',2) .set({foo:3},['abc']);[...myMap]//[['e1',2],[{foo:3},['abc']]]
//数组转Mapconst map=new Map([[1,2],[2,3]])
//Map转为对象function strMapToObj(strMap) { let obj = Object.create(null); for (let [k,v] of strMap) { obj[k] = v; } return obj;}const myMap = new Map() .set('yes', true) .set('no', false);strMapToObj(myMap)// { yes: true, no: false }//对象转为Mapfunction objToStrMap(obj) { let strMap = new Map(); for (let k of Object.keys(obj)) { strMap.set(k, obj[k]); } return strMap;}objToStrMap({yes: true, no: false})