• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

用JavaScript理解集合

用JavaScript理解集合  第1张

如果您了解如何使用集合,它们会非常强大。集合的一些应用包括解决计数问题,您可能希望找到可以将元素组合在一起的方式的数量。 

另一个应用是需要您找到元素之间关系的问题。ECMAScript 规范不包括以这种方式对集合进行操作的方法。但是可以创建自己的。 

以下是集合论的概述以及可用于扩展javascript功能和解决更复杂问题的实际应用程序

内容

  • 基本

  • 联盟

  • 路口

  • 区别

  • 对称差

  • 补充

  • 审查

基本

集合是所有唯一元素的无序集合。例如,您工作的所有员工的列表是一个集合。每个员工都是集合中的一个元素。实际上,这些元素将使用 ID 或社会安全号码进行存储,因为我们可以确保这些值是唯一的。请注意,这些元素的顺序与我们无关,因为对 ID 或社会安全号码进行排序没有任何意义。  

我们称我们的员工集合为通用集合,因为它包含所有考虑的元素。让我们想象另一组。这组是贵公司在工程部门工作的员工列表。这是我们员工集的一个子集,因为工程集中的每个元素也存在于员工集中。另一个子集是作为自由承包商的员工列表。下面是我们如何在 JavaScript 中创建这些集合:

let engineering = new Set(['Alberta', 'Dr. Gero', 'Trunks', 'Bulma', 'Gohan']);let freelancers = new Set(['Piccolo','Trunks', 'Vegeta', 'Goku', 'Gohan']);

如果您想将另一个人添加到我们的集合中,我们将使用语法set.add(value) 并替换 set为我们集合的名称和value要添加的元素的值。如果我们尝试添加一个已经在集合中的元素,它将不会被添加。例子:

let engineering = new Set(['Alberta', 'Dr. Gero', 'Trunks', 'Bulma', 'Gohan']);
engineering.add('Gohan');
console.log(engineering);

这将打印 Set { 'Alberta', 'Dr. Gero,“Trunks”,“Bulma”,“悟饭”}。

现在,你可能在想那又怎样?我可以用这些信息做什么?接下来我们将看到如何对集合进行操作以帮助我们解决一些常见问题。

联盟

如果我们想找到我们公司所有的自由职业者或在工程部门工作的员工怎么办?我们需要合并这两组,然后删除所有重复的名称。这叫做联合。 

两个集合的并集是包含来自任一集合或两个集合的元素的集合。请注意我们的工程集合中的元素如何也在自由职业者集合中。这是找到两个集合并集的一种方法:

let engineering = new Set(['Alberta', 'Dr. Gero', 'Trunks', 'Bulma', 'Gohan']);
let freelancers = new Set(['Piccolo','Trunks', 'Vegeta', 'Goku', 'Gohan']);
let union = new Set([...engineering, ...freelancers]);
console.log(union);

运算符将我们的...集合变成一个数组,在组合两个数组后,Set const ructor 会删除重复的元素。两组的并集将是 Set {'Alberta', 'Dr. Gero,“树干”,“布尔玛”,“悟饭”,“短笛”,“贝吉塔”,“悟空”}。

任务

集合 [1, 3, 5, 7, 9] 和 [2, 3, 4, 6] 的并集是什么?

路口

假设我们要查找工程部门的所有员工并且是自由职业者。这是集合的交集。两个集合的交集是包含两个集合中元素的集合。 

为了重现这一点,我们可以搜索一组并检查每个元素是否在另一组中。要检查元素是否在集合中,我们使用has方法。例子:

let engineering = new Set(['Alberta', 'Dr. Gero', 'Trunks', 'Bulma', 'Gohan']);
console.log(engineering.has('Alberta'));

这将返回 true。使用该has方法,我们可以过滤我们的工程集以查找也在自由职业者集中的项目。

let engineering = new Set(['Alberta', 'Dr. Gero', 'Trunks', 'Bulma', 'Gohan']);
let freelancers = new Set(['Piccolo','Trunks', 'Vegeta', 'Goku', 'Gohan']);
let intersection = new Set([...engineering].filter(x => freelancers.has(x)));
console.log(intersection);

工程和自由职业者的交集是 Set { 'Trunks', 'Gohan' }。

任务

集合 [1, 3, 5, 7, 9] 和 [2, 3, 4, 6] 的交集是什么?

区别

让我们考虑一下我们想要找到不是自由职业者的工程师的场景。这就是区别。两个集合的区别在于包含在第一个集合中但不在第二个集合中的元素的集合。 

对我们来说,这意味着我们将从工程集开始,然后删除自由职业者集中的所有元素。例子:

let engineering = new Set(['Alberta', 'Dr. Gero', 'Trunks', 'Bulma', 'Gohan']);
let freelancers = new Set(['Piccolo','Trunks', 'Vegeta', 'Goku', 'Gohan']);
let difference = new Set([...engineering].filter(x => !freelancers.has(x)));
console.log(difference);

工程集和自由职业者集的区别是 Set { 'Alberta', 'Dr. 格罗','布尔玛'}。如果我们想获得自由职业者而非工程师的列表,我们从自由职业者集开始,并删除出现在工程师集中的元素。例子:

v

这给了我们不同的结果。自由职业者集和工程集的区别是 Set { 'Piccolo', 'Vegeta', 'Goku' }。

任务

求 [1, 3, 5, 7, 9] 和 [2, 3, 4, 6] 的区别。

求 [2, 3, 4, 6] 和 [1, 3, 5, 7, 9] 的区别。

对称差

现在,我们想找出公司中的工程师或自由职业者,但不能两者兼而有之。这就是对称差异。两个集合的对称差异是包含来自任一集合但不是两个集合的元素的集合。 

我们可以使用的一种方法是找到两组的并集(每个人是工程师、自由职业者或两者兼而有之)并减去交集(每个人既是工程师又是自由职业者)。结合我们之前使用的技术,我们可以用下面的代码得到对称差:

let engineering = new Set(['Alberta', 'Dr. Gero', 'Trunks', 'Bulma', 'Gohan']);
let freelancers = new Set(['Piccolo','Trunks', 'Vegeta', 'Goku', 'Gohan']);
let union = new Set([...engineering, ...freelancers]);
let intersection = new Set([...engineering].filter(x => freelancers.has(x)))
let symmetricDifference = new Set([...union].filter(x => !intersection.has(x)));
console.log(symmetricDifference);

我们的工程集和自由职业者集的对称差异是 Set { 'Alberta', 'Dr. 格罗,“布尔玛”,“短笛”,“贝吉塔”,“悟空”}。

任务

求 [1, 3, 5, 7, 9] 和 [2, 3, 4, 6] 的对称差。

补充

如果我们有我们的一组员工和一组工程师,我们怎么能找到所有不是工程师的人呢?我们可以做的一件事是从员工集中减去工程师集。该套装是对我们的工程师套装相对于我们的员工套装的补充。例子:

let employees = ['Alberta', 'Dr. Gero', 'Trunks', 'Bulma', 'Gohan', 'Goku', 'Piccolo', 'Vegeta'];
let engineering = new Set(['Alberta', 'Dr. Gero', 'Trunks', 'Bulma', 'Gohan']);
let complement = new Set([...employees].filter(x => !engineering.has(x)));
console.log(complement);

与我们的员工集相关的工程集的补充是 Set { 'Goku', 'Piccolo', 'Vegeta' }。

任务

给定全集 [1 ,2, 3, 4, 5, 6, 7, 8, 9, 10],找到集 [2, 4, 6, 8, 10] 的补集。

审查

当您需要比较不同的列表、组合列表或在列表中查找唯一元素时,集合会派上用场。下次遇到需要以这种方式分析数据的问题时,请考虑使用上述集合操作之一。以下是讨论的关键术语的列表:

  • 集合:唯一的、无序元素的集合。

  • 通用集:集合中所有可能的元素。

  • 子集:集合中较小的集合。

  • 集合 A 和 B 的并集:包含 A、B 或两者中的元素的集合。

  • 集合 A 和 B 的交集:包含来自 A 和 B 的元素的集合。

  • 集合 A 和 B 的区别:包含 A 中的元素但不包含 B 的集合。

  • 集合 A 和 B 的对称差异:集合包含 A 或 B 中的元素,但不能同时包含两者。

  • 集合 A 的补集:全集中不属于 A 的元素。



文章目录
  • 内容
  • 基本
  • 联盟
    • 任务
  • 路口
    • 任务
  • 区别
    • 任务
  • 对称差
    • 任务
  • 补充
    • 任务
  • 审查