博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Set和Map数据结构
阅读量:6954 次
发布时间:2019-06-27

本文共 4204 字,大约阅读时间需要 14 分钟。

本系列属于阮一峰老师所著的学习笔记


Set

Set类似数组,但是成员的值都是唯一的没有重复的值,Set本身是一个构造函数,用来生成Set数据结构

const s = new Set()[2,3,4,5,2,3,2].forEach(x => s.add(x))for(let i of s){  console.log(i)}// 2,3,4,5const set = new Set([1,2,3,4,4])[...set] // [1,2,3,4]set.size // 4//向Set中加入值的时候,不会发生类型转换,5与'5'是两个值,判断值是否相等类似===,区别是NaN等于自身const set = new Set([NaN,NaN]) // Set(1) {NaN}//两个对象总是不相等的const set = new Set([{},{}]) // Set(2) {
{...},{...}}
Set实例的属性和方法

有以下属性:

  • Set.prototype.constructor :构造函数,默认是Set函数
  • Set.prototype.size :返回Set实例的成员总数

有以下方法:

  • add(value) :添加某个值,返回Set结构本身
  • delete(value) :删除某个值,返回布尔值,表示删除是否成功
  • has(value) :返回一个布尔值,表示该值是否为Set的成员
  • clear() :清除所有成员,无返回值
s.add(1).add(2).add(2)s.size // 2s.has(1) // trues.has(3) // falses.delete(2) // true// Array.from方法可以将Set结构转为数组const items = new Set([1,2,3,4,5])const array = Array.from(items) // [1,2,3,4,5]// 利用Set去重function dedupe(array){    return Array.from(new Set(array))}
Set的遍历操作

有以下四种遍历方法,遍历顺序就是插入顺序:

  • keys() :返回键名
  • values() :返回键值
  • entries() :返回键值对
  • forEach() :使用回调函数遍历每个成员
let set = new Set(['red','green','blue'])// Set结构默认的遍历器生成函数就是values,所以遍历value时可以直接省略values方法直接遍历Set.prototype[Symbol.iterator] === Set.prototype.values // tuefor(let x of set){    console.log(x)}// red green blueset.forEach((value,key) => console.log(key + ':' + value))// red:red green:green blue:bluelet arr = [...set] // ['red','green','blue']// 与拓展运算符结合去重let unique = [..new Set(set)] // ['red','green','blue']// 结合数组方法map和filter操作Setlet set = new Set([1,2,3])set = new Set([...set].map(x => x*2)) // Set {2,4,6}let set = new Set([1,2,3,4,5])set = new Set([...set].filter(x => (x%2)==0)) // Set {2,4}//利用Set可以很方便的实现并集、交集、差集let a = new Set([1,2,3])let b = new Set([4,3,2])let union = new Set([...a,...b]) // Set {1,2,3,4}let intersect = new Set([...a].filter(x => b.has(x))) // Set {2,3}let difference = new Set([...a].filter(x => !b.has(x))) // Set {1}// 改变原有Set结构的方法let set = new Set([1,2,3])set = new Set([...set].map(val => val*2)) // set {2,4,6}set = new Set(Array.from(set,val => val*2)) // set {2,4,6}
WeakSet

WeakSetSet类似,区别在于:WeakSet的成员只能是对象;WeakSet对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet

因此,WeakSet的成员不适合引用,因为它随时会消失,也不可以遍历

const a = [[1,2],[3,4]]const ws = new WeakSet(a) // WeakSet {[1,2],[3,4]}// WeakSet只有add()、delete()、has()三种方法,无size属性,不可遍历,无clear()方法
Map

传统对象键值只能是字符串,Map提供了一种方法,可以接收键值不仅为字符串,提供"值-值"对应的结构

// 利用Map结构的set方法,将对象作为键const m = new Map()const o = {p:'Hello World'}m.set(o,'content')m.get(o) // 'content'm.has(o) // truem.delete(o) // true// Map结构接收数组参数const map = new Map([['name','张三'],['title','Angus']])map.size // 2map.has('name') // truemap.get('name') // 张三// 不仅是数组,所有具有Iterator接口、每个成员都是一个双元素的数组数据结构都可以作为Map函数的参数const set = new Set([['foo',1],['bar',2]])const m1 = new Map(set)m1.get('foo') // 1// 对一个键多次赋值,后面的值将会覆盖前面的值const map = new Map()map.set(1,'1').set(1,'2')map.get(1) // '2'
Map实例的属性和操作方法
const map = new Map()map.set('foo',true).set('bar',false)map.size // 2map.get('foo') // truemap.has('foo') // truemap.delete('foo') // truemap.clear()
Map实例的遍历方法
const map = new Map([['F','no'],['T','yes']])// keys()方法for(let key of map.keys()){    console.log(key) // 'F' 'T'}// values()方法for(let value of map.values()){    console.log(value) // 'no' 'yes'}// entries()方法for(let item of map.entries()){    console.log(item) // ['F','no'] ['T','yes']}// Map结构默认的遍历器接口就是entries()方法[...map] // [['F','no'],['T','yes']]// 结合数组的map和filter方法,实现Map的遍历和过滤const map = new Map().set(1,'a').set(2,'b')const map1 = new Map([...map].filter(([k,v]) => k<3)) // Map(2) {1=>'a',2=>'b'}const map2 = new Map([...map].map(([k,v]) => [k*2,'_'+v])) // Map(2) {2=>'_a',4=>'_b'}// forEach方法map.forEach(function(value, key, map) {  console.log("Key: %s, Value: %s", key, value); // Key:1,Value:a Key:2,Value:b});// forEach接收第二个参数用来绑定thisconst reporter = {  report: function(key,value){    console.log('Key:%s,Value:%s',key,value)  }}map.forEach(function(value,key,map){    this.report(key,value) // Key:1,Value:a Key:2,Value:b},reporter)
WeakMap

WeakMapMap类似,但有两点区别:WeakMap只接收对象作为键名;WeakMap键名所指向的对象,不计入垃圾回收机制,这一点与WeakSet相同。

WeakMap不能使用size属性,不能遍历,也不支持clear

可用方法有get()set()has()delete

转载于:https://www.cnblogs.com/pengzhixin/p/7688309.html

你可能感兴趣的文章
PhpMyAdmin的配置
查看>>
oracle 查询月份
查看>>
mysql参数详解
查看>>
hdu1753 java大实数加法
查看>>
抗压力就是一切!!!
查看>>
Listen 0.0.0.0:80 Listen [::0]:80
查看>>
织梦内容模型管理(人才招聘)
查看>>
那天有个小孩跟我说LINQ(三)
查看>>
[AaronYang]C#人爱学不学[2]
查看>>
[ NOI 2005 ] 聪聪与可可
查看>>
Sublime Text 模板插件SublimeTmpl
查看>>
无缝滚动
查看>>
split添加limit参数
查看>>
Tomcat
查看>>
网络编程 - 实现文件传送
查看>>
Python 列表字典制作名册管理
查看>>
学习自查:目录(更新中...)
查看>>
JQuery01
查看>>
Java 详解 JVM 工作原理和流程
查看>>
对大学努力的理解
查看>>