Set 数据结构以及 Set与数组的区别
Set 是一种 集合数据结构,它类似于数组,但与数组不同
一、Set 与 数组的区别?
-
-
- API不同
- Set 元素不能重复(可以用作数组去重),而数组中的元素可以重复
- Set 是无序结构(即添加的顺序和输出顺序不能保证一致),但操作很快;而数组是有序数据结构(即添加的顺序和输出顺序一致),但操作慢
-
二、Set API 操作:
1、创建 Set
创建一个新的集合,通过add方法添加数据
1 2 3 4 5 6 7 | const mySet = new Set() mySet.add(1) mySet.add(2) mySet.add(2) mySet.add(3) mySet.add(4) console.log(mySet) |
直接初始化集合
const mySet = new Set([1,2,2,3,4])
console.log(mySet)
上面两种代码均打印如下:
2、实例的属性和方法
- size: 返回Set实例的成员总数
console.log(mySet.size) // 返回集合的大小
- add(value): 添加某个value
mySet.add(5)
- delete(value): 删除某个值,返回一个布尔值,表示删除是否成功
mySet.delete(2)
- has(value): 返回一个布尔值,表示该值是否为Set的成员
console.log(mySet.has(2))// false
- clear: 清除所有成员,没有返回值
mySet.clear()
3、遍历
- keys(): 返回键名的遍历器
for (let i of mySet.keys()){ console.log(i) //1,2,3,4 }
- values(): 返回键值的遍历器
for (let i of mySet.values()){ console.log(i) //1,2,3,4 }
- entries(): 返回键值对的遍历器
for (let i of mySet.entries()){ console.log(i) //[1,1], [2,2],[3,3],[4,4] 键、值都相等 }
- forEach(): 遍历每个成员
// Set虽然类似数组,但没有索引值,只有具体的值。所以遍历的index和value相等 mySet.forEach((value,index)=>{ console.log(value) //1,2,3,4 console.log(index) //1,2,3,4 });
- for...of:Set内部已实现了迭代器,所以可以是用for...of
for (let value of mySet){ console.log(value) //1,2,3,4 }
三、将Set转化成数组:
- 使用扩展运算符
console.log([...mySet]) //[1,2,3,4]
- 使用Array.from()
console.log(Array.from(mySet)) //[1,2,3,4]
四、复杂数据结构去重
//复杂数据结构去重 function uni(arr){ let res = new Set() const newarr = arr.filter(item=>{ let id = JSON.stringify(item) if(res.has(id)){ return false }else{ res.add(id) return true } }) return newarr } var arr=[ 1, 'ceshi', {name:'zhanfsan'}, {name:'zhanfsan'}, {name:'lisi'}, [1,2], [3,4], [1,2], undefined, NaN, undefined, NaN ] var newarr = uni(arr) console.log(newarr)
五、Set 和 WeakSet区别
-
-
- WeakSet 只能用对象做为value; 而Set的值可以是任意类型
- WeakSet 中的对象的引用为弱引用,即如果WeakSet 中的对象没有了其他的引用,就会被垃圾回收。而Set中的对象不会被回收
- WeakSet 中的对象都是弱引用,所以没有keys()、values()、entries()、forEach等方法和size属性。
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!