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中任何一种数组去重的方法都来得方便。