这里贴一段MDN的描述:
Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
Set 本身是一种构造函数,用来生成 Set 数据结构。
看下例子:
const s = new Set();
[1, 2, 3, 4, 3, 2, 1, "1"].forEach(x => s.add(x))
// 通过for of遍历
for (let i of s) {
console.log(i) // 1 2 3 4 "1"
}
// 利用元素唯一性实现数组去重
let arr = [1, 2, 3, 2, 1, 1]
[... new Set(arr)] // [1, 2, 3]
需要注意的是,Set在加入值的时候,不会发生类型转换,所以1和“1”被认为是不同的值,类似于使用===
来匹配。不过需要注意NaN:NaN === NaN => false。
Set实例有下面这些方法:
- size:内部元素数量
- add:添加
- delete:删除
- has:是否存在?返回true和false
- clear:清空集合
let set = new Set()
set.add(1).add(2).add(1)
set.has(1) // true
set.has(3) // false
set.delete(1)
set.has(1) // false
使用Array.from
把Set转成数组,或者使用展开运算符:
const items = new Set([1, 2, 3, 2])
const array = Array.from(items)
console.log(array) // [1, 2, 3]
// 或
const arr = [...items]
console.log(arr) // [1, 2, 3]
既然是集合,那么Set就具有可便利性,出了for of
,还有实例对象带有的方法:
- keys:返回一个包含集合中所有键的迭代器
- values: 返回一个包含集合中所有值得迭代器
- entries:返回一个包含Set对象中所有元素得键值对迭代器
- forEach:没有返回值,作用跟数组forEach相似
let set = new Set([1, 2, 3])
console.log(set.keys()) // SetIterator {1, 2, 3}
console.log(set.values()) // SetIterator {1, 2, 3}
console.log(set.entries()) // SetIterator {1, 2, 3}
for (let item of set.keys()) {
console.log(item);
} // 1 2 3
for (let item of set.entries()) {
console.log(item);
} // [1, 1] [2, 2] [3, 3]
set.forEach((value, key) => {
console.log(key + ' : ' + value)
}) // 1 : 1 2 : 2 3 : 3
console.log([...set]) // [1, 2, 3]
Set跟数组作用类似,不过是无序的,可以使用Set元素的唯一性轻松实现交集、并集、差集:
let set1 = new Set([1, 2, 3])
let set2 = new Set([4, 3, 2])
let intersect = new Set([...set1].filter(value => set2.has(value)))
let union = new Set([...set1, ...set2])
let difference = new Set([...set1].filter(value => !set2.has(value)))
console.log(intersect) // Set {2, 3}
console.log(union) // Set {1, 2, 3, 4}
console.log(difference) // Set {1}