概念:
类似于数组,但是成员的值都是唯一的,没有重复的值。
基本用法
Set是一个构造函数,通过new生成Set数据结构。参数可以是数组(具有iterable接口的数据类型,比如nodeList,字符串,arguments)
var s
// 数组
s = new Set([1, 2, 2, 1])
console.log(s) // Set { 1, 2 }
// 字符串
s = new Set('abcabc')
console.log(s) // Set { 'a', 'b', 'c' }
// arguments
function a () {
console.log(new Set(arguments)) // Set {1, 2, 4}
}
a(1, 2, 4)
数组去重:
// 去除数组的重复成员
[...new Set([1,2,2,1])] // [1,2]
字符串去重:
[...new Set('ababbc')].join('') // "abc"
去重的判断规则是类似于全等运算符===,不同之处在于,这里的NaN === NaN 是true。
属性和方法
属性
- Set.prototype.size 返回Set实例的成员总数
操作方法
- add(val): 添加元素,返回Set实例
- delete(val): 删除某个元素,返回布尔值,表示删除是否成功
- has(val): 返回布尔值,表示实例中是否存在该元素
- clear(): 清空实例,无返回值
Set实例的方法相比数组要方便很多,比如delete,has。对于数组中不存在重复元素的情况下,使用Set数据结构更方便。
遍历方法
- keys(): 返回键名的遍历器
- values(): 返回键值的遍历器
- entries(): 返回键值对的遍历器
- forEach(): 使用回调函数遍历每个成员
由于Set没有键名,只有健值,所以可以理解成键名,健值是同一个值。所以以上的遍历方法得到的键名,健值是相等的。
使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和 差集(Difference):
let a = new Set([2, 3, 4])
let b = new Set([3, 4, 5])
// 并集
let union = new Set([...a, ...b])
console.log(union)
// Set { 2, 3, 4, 5}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)))
console.log(intersect)
// set {3, 4}
// 差集
let difference = new Set([...a].filter(x => !b.has(x)))
console.log(difference)
// Set {2}
WeakSet
WeakSet是一个构造函数,使用new创建WeakSet结构。WeakSet结构成员只能是对象,而且如其名都是弱引用,无法遍历。
const ws = new WeakSet(params)
params可以是数组或具有iterable接口的对象,该数组的所有成员都会自动成为WeakSet对象的成员。所以该数组的所有成员只能是对象。
const a = [[1, 2], [3, 4]];
const ws = new WeakSet(a);
// WeakSet {[1, 2], [3, 4]}