6.Javascript集合

6-集合(第9章)

6.1集合

集合(set)是一种包含不同元素的数据结构。集合中的元素称为成员。集合的两个最重要特性是:

  • 集合中的成员是无序的;
  • 集合中不允许相同成员存在

6.1.1 集合的定义

  • 不包含任何成员的集合称为空集, 全集则是包含一切可能成员的集合
  • 如果两个集合的成员完全相同,则称两个集合相等
  • 如果一个集合中所有的成员都属于另外一个集合,则前一集合称为后一集合的子集

6.1.2 集合的操作

  • 并集:将两个集合中的成员进行合并,得到一个新集合
  • 交集:两个集合中共同存在的成员组成一个新的集合
  • 补集:属于一个集合而不属于另一个集合的成员组成的集合

6.2 集合的实现

原书中集合的实现使用的是数组,可能那时候还没有出来es6。现在es6已经出来了,集合Set变成js原生的数据结构。以下内容是我对es6集合的讲解。

6.2.1 创建一个集合

语法:

1
new Set([iterable])

iterable 是一个可迭代对象,它的所有元素将不重复地被添加到新的 Set中。如果不指定此参数或其值为null,则新的 Set为空。

创建一个空的set

1
const s1 = new Set() // Set(0) {}

创建一个参数为可迭代对象的Set

1
const s2 = new Set([1,2,3]) // Set(3) {1, 2, 3}

6.2.2 Set中的值具有唯一性

Set中的每一个值都是唯一的,Set判断两个值是否相等使用类似===的比较方法,跟===不一样的地方是在集合里NaN是等于NaN的。而在===中,NaN是不等于NaN的

1
2
3
4
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:表示结合中成员的个数
1
2
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 保存一个回调函数列表,调用时就能保证按照添加顺序调用。

1
2
3
4
5
6
7
8
9
10
11
12
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) {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 交集、并集和差集

1
2
3
4
5
6
7
8
9
10
11
12
13
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)));

个人评价:关于集合大概也就这么多内容,集合还是蛮简单的