6-集合(第9章)
6.1集合
集合(set)是一种包含不同元素的数据结构。集合中的元素称为成员。集合的两个最重要特性是:
- 集合中的成员是无序的;
- 集合中不允许相同成员存在
6.1.1 集合的定义
- 不包含任何成员的集合称为空集, 全集则是包含一切可能成员的集合
- 如果两个集合的成员完全相同,则称两个集合相等
- 如果一个集合中所有的成员都属于另外一个集合,则前一集合称为后一集合的子集
6.1.2 集合的操作
- 并集:将两个集合中的成员进行合并,得到一个新集合
- 交集:两个集合中共同存在的成员组成一个新的集合
- 补集:属于一个集合而不属于另一个集合的成员组成的集合
6.2 集合的实现
原书中集合的实现使用的是数组,可能那时候还没有出来es6。现在es6已经出来了,集合Set变成js原生的数据结构。以下内容是我对es6集合的讲解。
6.2.1 创建一个集合
语法:
new Set([iterable])
复制代码
iterable 是一个可迭代对象,它的所有元素将不重复地被添加到新的 Set中。如果不指定此参数或其值为null,则新的 Set为空。
创建一个空的set
const s1 = new Set() // Set(0) {}
复制代码
创建一个参数为可迭代对象的Set
const s2 = new Set([1,2,3]) // Set(3) {1, 2, 3}
复制代码
6.2.2 Set中的值具有唯一性
Set中的每一个值都是唯一的,Set判断两个值是否相等使用类似===的比较方法,跟===不一样的地方是在集合里NaN是等于NaN的。而在===中,NaN是不等于NaN的
console.log(NaN === NaN) // false
const s3 = new Set([NaN, NaN, 1, '1', +0, -0, true, true, false, false, undefined, null])
// Set(8) {NaN, 1, "1", 0, true, false, undefined, null}
复制代码
6.2.3 Set的属性
-
size:表示结合中成员的个数
const s3 = new Set([NaN, NaN, 1, '1', +0, -0, true, true, false, false, undefined, null]) console.log(s3.size) // 8
6.2.4 Set的方法
- add(value): 添加某个值,返回添加值后新的Set。如果添加的值Set中已经存在,则返回的Set跟之前一样
- delete(value): 删除某个值,如果删除成功就返回true,否则返回false
- has(value):判断某个值是否在集合中,如果在就返回true,否则返回false
- clear():清除所有成员,没有返回值
- keys():返回键名的遍历器
- values():返回键值的遍历器
- entries():返回键值对的遍历器
- forEach():使用回调函数遍历每个成员
需要特别指出的是,Set的遍历顺序就是插入顺序。这个特性有时非常有用,比如使用 Set 保存一个回调函数列表,调用时就能保证按照添加顺序调用。
const s2 = new Set([1, 2, 3])
// add方法
s2.add('4') // Set(4) {1, 2, 3, "4"}
s2.add(1) // Set(4) {1, 2, 3, "4"}
// delete方法
s2.delete(1) // true s2:Set(3) {2, 3, "4"}
s2.delete(1) // false
// has方法
s2.has(1) // false
s2.has(2) // true
// clear 方法
s2.clear() // undefined s2:Set(0) {}
const s2 = new Set([1, 2, 3])
// keys
s2.keys() // SetIterator {1, 2, 3}
for (let key of s2.keys()) {
console.log('key:', key)
}
// 结果
key: 1
key: 2
key: 3
// values
s2.values() // SetIterator {1, 2, 3}
for (let val of s2.values()) {
console.log('val:', val)
}
// 结果
val: 1
val: 2
val: 3
// 因为Set没有健名,只有健值,所以对于Set来说keys和values返回的结果相同
// entries
for (let item of s2.entries()) {
console.log('item:', item)
}
item: (2) [1, 1]
item: (2) [2, 2]
item: (2) [3, 3]
// forEach
s2.forEach((val, key) => {
console.log('val:', val, ' key:', key)
})
val: 1 key: 1
val: 2 key: 2
val: 3 key: 3
复制代码
6.2.5 交集、并集和差集
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
复制代码
个人评价:关于集合大概也就这么多内容,集合还是蛮简单的