Set 和 WeakSet 数据结构
Set 和 WeakSet 数据结构是ES6新增。
它与数组非常相似,但是Set数据结构的成员都是唯一的。
特别说明:Set 中只能添加一个NaN
一、Set 数据结构:
1 2 3 4 5 | var set = new Set([1,2,3,4,2,8,10]) // 两个2 for ( var elem of set) { console.log(elem) } |
//-----------循环用 add 添加赋值 --------------
1 2 3 4 5 6 7 8 9 10 | var set = new Set() [1,2,3,4,2,8,10].map( function (elem){ set.add(elem) }) for ( let elem of set) { // for...of 遍历 console.log(elem) } |
//---------------- 扩展运算符 --------------------
1 2 3 4 5 6 7 | var set = new Set ([1,2,3,4,2,8,10]) var arr = [...set] // 扩展运算符(...)内部使用 for...of 循环 console.log(set) // [Object set] console.log(arr) // 1,2,3,4,2,8,10 |
//---------------- 清空、删除 --------------------
1 2 3 4 5 6 7 8 9 | var set = new Set([1,2,3,4,2,8,10]) set.clear() // 清空 set. delete (8) // 删除 var arr = [...set] console.log(arr) |
//----------------- 遍历键值 ----------------------
1 2 3 | set.forEach( function (value,key){ console.log(value + '=' + key) }) |
从输出结果可以看出,键和键值是相同的
//----------------- 判断set中是否含有 -----------
1 | console.log(set.has(8)) |
//----------------- 遍历值 ------------------------
1 2 3 4 5 | let setlter = set.values() //把所有的值单独拿出来 for ( let val of setlter) { console.log(val) } |
//------------------ 数量 -------------------------
1 | console.log(set.size) |
//------------------- map 和 filter 也可以用于set中--------
es5中数组新增 map 和 filter 方法
map: 映射的意思,映射返回一个新数组,有返回值;mapArr: 返回一个新对象
1 2 3 | var mapArr = array.map( function (value,index,array){ return value*value }) |
filter: 过滤、筛选的意思,有返回值;filterArr: 返回过滤后新数组
1 2 3 4 5 6 7 | var filterArr = array.filter( function (value,index,array){ if (value > 20) { return true } return false }) |
//--------------------------------------------------------
1 2 3 4 5 6 7 | let set = new Set([1,2,3]) set = new Set([...set].map(x => x*2)) var arr = [...set] console.log(arr) |
// 返回Set结构: {2,4,6}
1 2 3 4 5 6 7 | let set = new Set([1,2,3,4,5]) set = new Set([...set].filter( x => (x % 2) == 0)) var arr = [...set] console.log(arr) |
// 返回Set结构: {2,4}
//------------------ 求并集、交集、差集 ---------------------
使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)
1 2 3 | let a = new Set([1,2,3]) let b = new Set([4,3,2]) |
// 并集
1 2 3 4 5 | let union = new Set([...a,...b]) var arr = [...union] console.log(arr) // Set {1,2,3,4} |
// 交集
1 2 3 4 5 6 7 | let intersect = [...a].filter(x => b.has(x)) 即: let intersect = [...a].filter( function (x){ return b.has(x) // 返回 true,则 x 会被放入 intersect 集合中 }) console.log(intersect) // Set {2,3} |
// 差集
1 2 3 4 5 6 7 | let difference = [...a].filter( x => !b.has(x)) 即: let difference = [...a].filter( function (x){ return !b.has(x) }) console.log(difference) // Set {1} |
二、WeakSet 数据结构
它与 Set 十分相似,对象的值也不能是重复的,与 Set 不同点:
1.WeakSet 成员只能够是对象
2.作为 WeakSet 成员的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在与WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。
3.使用WeakSet存储对象实例的好处是,由于是对对象实例的引用,不会被计入内存回收机制,所以删除实例的时候,不用考虑weaket,也不会出现内存泄漏。 //-----错误------
1 2 3 | var weakset = new WeakSet() weakset.add(5) |
//-----正确------
1 2 3 4 5 | var weakset = new WeakSet() weakset.add({}) // 添加 var weakset = new WeakSet([[1,2],[3,4]]) |
//------例子------
1 2 3 4 5 6 7 8 9 10 11 12 13 | var weakset = new WeakSet() let aObj = {a: 'aa' } let bObj = new String( '你好' ) let cObj = new Number(8) weakset.add(aObj) weakset.add(bObj) weakset.add(cObj) |
//----------- 删除 --------------
1 2 3 4 5 | weakset. delete (aObj) bObj = null // 把对象删除,weakset中的对象也没了,垃圾回收机制,置空 console.log(weakset.has(bObj)) // weakset不能取值,也不能显示,只用来表示是否有重复的对象 |
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步