js ES6新数据结构 Set - Kaiqisan

js ES6新数据结构 Set

ヤッハロー、Kaiqisanすうう、一つふつうの学生プログラマである.说到集合,我们应该很熟悉,毕竟这个是咱高中第一节数学课的知识。集合有一个特点就是没有重复值,这也是今天讲的Set数据结构的最大的特点。

和数组类似的一种数据结构,它的一个特点就是所有的元素没有重复

let setList = new Set([1, 2, 2, 3, 4, 3, 5])
console.log(setList)
// 结果为 {1, 2, 3, 4, 5}
console.log(Array.from(setList)) // 利用这种方法正式把Set类型的数据变成正式的数组
// 结果为 [1, 2, 3, 4, 5]

需要注意的是,创立Set数据集的时候只能判断当前成员字面值是否相等,如果遇到对象(不同地址引用类型元素),就手足无措了。

let setList = new Set([1, 2, { name: 'tom' }, 3, 4,  { name: 'tom' }, 5])
console.log(setList) // {1, 2, { name: 'tom' }, 3, 4, { name: 'tom' }, 5}
// 不能排除一样的对象,是因为它们的地址不一样

接下来,我们来讲讲它的常用方法把!

提示:在控制台输入console.log(Set.prototype)就可以看到全部的Set方法

|||||||||||||||||

add(val): 往集合内添加一个元素,如果该元素已经存在于集合内部了,那么将这个待添加元素丢弃。这个方法存在返回值,也会改变原集合的内容

let setList = new Set([1])
setList.add(2) // {1, 2}
setList.add(1) // 集合内已经有元素1,不会再次添加,结果还是 {1, 2}
console.log(setList)

注意点

  • Set集合严格区分数据类型,字面值一样但是数据类型不一样的,在比较的时候还是会判定为不一样的数据。
let setList = new Set([1])
setList.add('1') // {1, '1'}
setList.add(2) // {1, '1', 2}
let setList = new Set([1])
setList.add(null) // {1, null}
setList.add(null) // {1, null} 
// 就算是null,在集合中也只能添加一个,这对于NaN ,undefined也是一样的
  • Set集合对于添加的对象,需要判断其地址是否相同,地址一样就算是一样的元素,就丢弃
let setList = new Set([1])
setList.add({ name: 'rom' }) // {1, { name: 'rom' }}
setList.add({ name: 'rom' }) // {1, { name: 'rom' }, { name: 'rom' }} 
// 临时创建的对象,引用地址不一样,判断为不一样的元素
let setList = new Set([1])
let Obj = { name: 'tom' }
setList.add(Obj) // {1, { name: 'tom' }}
setList.add(Obj) // {1, { name: 'tom' }}
// 都是引用于同一地址,判断为一样的元素

has(val): 判断集合内是否存在,我想要查找的元素。存在返回值,为 true/false(懂得都懂)

let setList = new Set([1, 2, 3, 4])
let flag = setList.has(2) // true
let flag = setList.has(5) // false

注意点

  • 严格区分数据类型,这里面的比较相当于 === 而不是 ==
let setList = new Set([1, 2, 3, 4])
let flag = setList.has('2') // false

对于对象的比较,要比较储存地址,地址不一样都为false

let setList = new Set([1, 2, 3, { name: 'tom' }])
let flag = setList.has({ name: 'tom' }) // false
// 上下两个都是临时定义的对象,地址不一样,所以判断为false
let Obj = { name: 'tom' }
let setList = new Set([1, 2, 3, Obj])
let flag = setList.has(Obj) // true
// 第二第三行的Obj都是引用于第一行的Obj,地址一样,所以为true

delete(val): 删除集合内的一个元素,如果删除成功就返回true,删除失败就返回false,其实这个没事好举栗子的,只不过这个delete操作是在上面的has操作之后再增加一个删除动作罢了。

clear(): 清空集合内所有元素,它没有返回值,会直接修改集合的内容

let setList = new Set([1, 2, 3, 4])
let res = setList.clear() // 返回空集合 {}

size: 返回当前集合的成员个数

除此之外,这个Set集合还拥有方法 entries() forEach() values() keys()以及迭代器 ,可以实现for in 和for of的迭代,但是无法实现数组的一般迭代方法比如map filter等等.

总结

ES6的一种新的数据结构,它的一般是用于数据的去重,使用这个Set数据结构的话,数据查重只需要两行代码.

let arr = [....]
let a = new Set(arr)
arr = Array.from(a)

这比现在js中任何一种数组去重的方法都来得方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaiqisan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值