数据结构-JS实现集合

3/9/2021 AlgorithmJavaScript

# 文章目录

# 一、什么是集合?

在这里插入图片描述

# 1.1 集合的常见方法

在这里插入图片描述

# 1.2 常见方法的实现

function Set() {
  // 属性
  this.items = {};

  // 方法
  // 1.add 向集合添加一个新的项
  Set.prototype.add = function(value) {
    // 判断当前集合中是否已经包含了该元素
    if (this.has(value)) return false;

    // 将元素添加到集合中
    this.items[value] = value;
    return true;
  };

  // 2.has 判断值是否在集合中
  Set.prototype.has = function(value) {
    // 判断某个对象是否含有指定的属性
    return this.items.hasOwnProperty(value);
  };

  // 3.remove(remove) 删除指定的元素
  Set.prototype.remove = function(value) {
    // 1.判断是否包含要删除的元素
    if (!this.has(value)) return false;

    // 2.将元素从属性中删除
    delete this.items[value];
    return true;
  };

  // 4.clear 清空
  Set.prototype.clear = function() {
    this.items = {};
  };

  // 5.size方法 获取集合中的元素个数
  Set.prototype.size = function() {
    return Object.keys(this.items).length;
  };

  // 6.values 获取集合中所有的值
  Set.prototype.values = function() {
    return Object.keys(this.items);
  };
}
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
43
44
45
46

测试代码:

// 测试
let set = new Set();

// 1.测试add
console.log(set.add("a"));
console.log(set.add("a"));
console.log(set.add("b"));
console.log(set.add("c"));

// 2.测试 values
console.log(set.values());

// 3.测试 remove
console.log(set.remove("c"));
console.log(set.remove("c"));

// 4.测试size
console.log(set.size());

// 5.测试 has
console.log(set.has("a"));

// 6.测试 clear
console.log(set.values());
console.log(set.clear());
console.log(set.values());
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

测试结果:

在这里插入图片描述

# 二、集合间的操作

# 2.1 集合间的常见操作

在这里插入图片描述

# 2.2 并集 返回一个包含两个集合所有元素的集合

// 1.并集
Set.prototype.union = function(otherSet) {
  // this:集合对象A
  // otherSet:集合对象B
  // 1.创建一个新的集合
  let unionSet = new Set();

  // 2.将A集合中所有元素添加到新集合中
  let values = this.values();
  for (let i = 0; i < values.length; i++) {
    unionSet.add(values[i]);
  }

  // 3.取出B集合中的元素,判断是否需要加入到新集合
  values = otherSet.values();
  for (let i = 0; i < values.length; i++) {
    unionSet.add(values[i]);
  }
  return unionSet;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

测试代码:

// 1.创建两个集合,并且添加元素
let setA = new Set();
setA.add("a");
setA.add("b");
setA.add("c");

let setB = new Set();
setB.add("aa");
setB.add("bb");
setB.add("c");
// 1.求两个集合的并集
console.log("求并集:=》", setA.union(setB));
1
2
3
4
5
6
7
8
9
10
11
12

测试结果:
在这里插入图片描述

# 2.3 交集 集合 A 中的元素同时存在于集合 B 中

// 2.交集
Set.prototype.intersection = function(otherSet) {
  // this:集合A
  // otherSet:集合B
  // 1.先创建一个新的集合
  let intersectionSet = new Set();

  // 2.从A中取出一个个元素,判断是否同时存在于集合B,是则存放入新集合
  let values = this.values();
  for (let i = 0; i < values.length; i++) {
    let item = values[i];
    if (otherSet.has(item)) {
      intersectionSet.add(item);
    }
  }
  return intersectionSet;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

测试代码:

// 1.创建两个集合,并且添加元素
let setA = new Set();
setA.add("a");
setA.add("b");
setA.add("c");

let setB = new Set();
setB.add("aa");
setB.add("bb");
setB.add("c");
// 2.求交集
console.log("求交集:=》", setA.intersection(setB));
1
2
3
4
5
6
7
8
9
10
11
12

测试结果:
在这里插入图片描述

# 2.4 差集 存在于 A 中,不存在于 B 中

Set.prototype.difference = function(otherSet) {
  // this:集合A
  // otherSet:集合B
  // 1.创建一个新的集合
  let differenceSet = new Set();

  // 2.取出A中的一个个元素,判断是否存在于B中,不存在,则添加到新集合中
  let values = this.values();
  for (let i = 0; i < values.length; i++) {
    let item = values[i];
    if (!otherSet.has(item)) {
      differenceSet.add(item);
    }
  }
  return differenceSet;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

测试代码:

// 1.创建两个集合,并且添加元素
let setA = new Set();
setA.add("a");
setA.add("b");
setA.add("c");

let setB = new Set();
setB.add("aa");
setB.add("bb");
setB.add("c");

// 3.求差集
console.log("求差集:=》", setA.difference(setB));
1
2
3
4
5
6
7
8
9
10
11
12
13

测试结果:
在这里插入图片描述

# 3.2 子集 A 中的每一个元素都存在于 B

// 4.子集
Set.prototype.subset = function(otherSet) {
  // 遍历集合A中的所有元素,如果都存在于B中,则返回true,
  // 只要有不存在于B中的,则放回false
  let values = this.values();
  for (let i = 0; i < values.length; i++) {
    let item = values[i];
    if (!otherSet.has(item)) {
      return false;
    }
    return true;
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13

测试代码:

// 1.创建两个集合,并且添加元素
let setA = new Set();
setA.add("a");
setA.add("b");
setA.add("c");

let setB = new Set();
setB.add("aa");
setB.add("bb");
setB.add("c");

let setC = new Set();
setC.add("a");
setC.add("b");
setC.add("c");
setC.add("d");

// 4.子集
console.log("求子集:=》", setA.subset(setB)); // A是不是B的子集
console.log("求子集:=》", setA.subset(setC)); // A是不是C的子集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

测试结果:
在这里插入图片描述

最后更新于: 2021年9月15日星期三晚上10点10分
Faster Than Light
Andreas Waldetoft / Mia Stegmar