es6语法的map和set
一:Set集合
类似于数组,但是成员的值都是唯一的, Set
本身是一个构造函数用来生成Set
数据结构
Set集合的常用方法:
-
add()
添加值,返回Set结构本身
const set = new Set() set.add(1) set.add(1) set.add(2) set.add(2) console.log(set) //最终输出Set { 1, 2 }
-
delete()
删除值,返回布尔值表示是否删除成功
let set = new Set() set.add(1) set.delete(1) //true console.log(set) //Set {}
-
has()
返回布尔值,判断
Set
对象中是否含有某值let set = new Set() set.add('hello') set.add('world') set.has('hello') //true set.has(1) //false
-
clear()
移除所有元素,没有返回值
-
keys()
返回一个
Iterator
对象,对象按照原Set
对象元素的插入顺序返回其所有元素let set = new Set() set.add('1') set.add('2') const keys = set.keys() console.log(keys) //{ '1', '2' } console.log(keys.next().value) //1 console.log(keys.next().value) //2
-
values()
与
keys()
用法一样,返回Iterator
对象,返回值也与keys()
一样 -
entries()
返回一个键值对形式的迭代器,类似
[value, value]
形式的数组
value
是集合中的每个元素let set = new Set() set.add('1') set.add('2') const entries = set.entries() console.log(entries.next().value) //[ '1', '1' ] console.log(entries.next().value) //[ '2', '2' ]
二:Map集合
类似于对象,是键值对的集合,数据可为任意类型,与
Object
的区别在于Object
的键
只能是字符串或者Symbols
,但Map
可以为任意类型,且Map
中的键值是有序的
Map
结构的实例方法 -
set(key, value)
设置键值对,返回整个
Map()
结构,若对应键已有值则覆盖原有的值let map = new Map() map.set('name', '张三') console.log(map) //{ 'name' => '张三' }
-
get(key)
获取
key
对应的键值,若没有则返回undefined
let map = new Map() map.set('name','张三') console.log(map.get('name')) //张三
-
has(key)
返回布尔值,查询
key
是否在当前对象中let map = new Map() map.set('name','张三') console.log(map.has('name')) //true console.log(map.has('age')) //false
-
delete(key)
删除
key
对应的键值对,删除成功返回true
否则返回false
let map = new Map() map.set('name','张三') console.log(map.delete('name')) //true console.log(map) //{}
-
clear()
清除所有键值对,没有返回值
-
keys()
返回新的
Iterator
对象,按顺序插入Map
对象中所有key
let map = new Map() map.set('name','张三') map.set('age','21') map.set('gender','男') console.log(map.keys()) //{ 'name', 'age', 'gender' }
-
values()
返回新的
Iterator
对象,按顺序插入Map
对象中所有value
let map = new Map() map.set('name','张三') map.set('age','21') map.set('gender','male') console.log(map.keys()) //{ '张三', '21', 'male' }
-
entries()
返回新的
Iterator
对象,按顺序插入Map
对象中每个元素的[key,value]
数组let map = new Map() map.set('name','张三') map.set('age','21') map.set('gender','male') console.log(map.entries()) //{ [ 'name','张三' ],[ 'age','21' ],[ 'gender','male' ] }
-
forEach(callback,thisArg)
callback(key,value,Map)
必选,对象中每个元素都要执行的回调函数key-当前元素的键 value-当前元素的值 Map-当前正在遍历的对象 thisArg`可选,回调函数执行时的`this`的值 ,`forEach()`返回值为`undefined
let map = new Map() map.set('name','张三') map.set('age','21') map.set('gender','male') map.forEach((value, key)=> { console.log(key+' = '+value) }) //name = 张三 //age = 21 //gender = male
三:工作中的实际解决的问题
最近在写js代码的时候,遇到一个比较棘手的问题,js代码for循环如果次数过多,会导致内层的for的变量未定义不可以使用的情况,使用map集合来实现数据的存储。
function getSearch(data){ if(data.id==''){ return false; } else{ for(var i=0;i<Server.length;i++){ if(data.id==Server[i].id){ data.ip=Server[i].ip; data.port=Server[i].port; data.type=Server[i].type; data.id=Server[0].id; data.deviceId = '0'; } } // 定义一个map var recMap = new Map(); // 先将所有集合的情况放到map中存储起来 for(var i = 0;i < Server.length;i++) { recMap.set(Server[i].id,i+1); } // 需要和map集合比对的数据 var dat = data.id.split(";"); var rlist = []; // 数据和map进行比对 for(var k = 0 ; k < dat.length ; k++){ // if条件筛选合适的 if(recMap.get(dat[k])){ var temp = {}; var j = recMap.get(dat[k])-1; temp.ip=Server[j].ip; temp.port=Server[j].port; temp.type=Server[j].type; temp.id=Server[j].id; rlist.push(temp); } } data.ListString = JSON.stringify(rlist); } }
参考链接:
https://segmentfault.com/a/1190000020091905
https://blog.csdn.net/weixin_41646716/article/details/91509295