蓝桥杯18585-工作协调
一、项目背景
在项目管理工作中,需要对分散的工作内容进行整理,以确定哪些工作可由成员独立完成,哪些工作需要多方配合完成。本题通过实现集合的差集、交集和并集运算,来辅助完成任务的整理。具体需要在 js/xset.js 文件中补全相关函数代码。
二、项目代码文件夹结构
├── css
├── js
│ ├── xset.js
│ └── index.js
└── index.html
-
css:样式文件夹。 -
index.html:主页面。 -
js/index.js:页面初始化的 js 文件。 -
js/xset.js:待补充代码的 js 文件。 -

目标
请在
js/xset.js文件中补全函数 TODO 部分代码,最终实现任务的整理。具体需求如下:代码中的
Xset类型继承自Set,可以直接理解为Set类型,下面所有方法的返回值必须Xset类型!- 完善
static difference方法,实现差集计算,实现独立任务的展示。该方法接收 2 个参数,参数a和参数b都是类型为XSet的集合,返回值为a和b的差集集合,即包含在集合a但不包含在集合b内的元素的集合,类型为 XSet。注意:本题只考虑 a 差 b 的情况。
示例如下:
//示例1 let a = new XSet(['1.编写PRD文档', '2.页面走查','3.产品验收', '4.测试用例编写']); let b = new XSet(['1.编写PRD文档']); XSet.difference(a, b); // 返回值为: XSet(3) {'2.页面走查','3.产品验收', '4.测试用例编写'} // 示例2 let a = new XSet(['1.编写PRD文档', '2.页面走查','3.产品验收' ); let b = new XSet(['1.编写PRD文档','4.测试用例编写']]); XSet.difference(a, b); // 返回值为: XSet(2) {'2.页面走查','3.产品验收'}- 完善
static intersection方法,实现交集计算,实现配合任务的展示。该方法接收 1 个或多个参数,参数a为类型为XSet的集合,参数bSets将剩余的参数收集到元素类型为XSet的二维数组,返回结果为a和bSets中所有集合的交集集合,即a集合和bSets中多个集合共有的元素构成的集合。
示例如下:
// 示例 1 let a = new XSet(['1.编写PRD文档', '2.页面走查','3.产品验收', '4.测试用例编写']); let bSets = [[new XSet(['1.编写PRD文档', '2.页面走查','3.产品验收']), new XSet(['4.测试用例编写', '5.接口测试', '6.整体测试'])]]; XSet.intersection(a, bSets); // 返回值为:XSet(0) {}// 示例 2 let a = new XSet(['1.编写PRD文档', '2.页面走查','3.产品验收', '4.测试用例编写']); let bSets = [[new XSet(['1.编写PRD文档', '2.页面走查','3.产品验收']), new XSet(['1.编写PRD文档', '4.测试用例编写','3.产品验收'])]]; XSet.intersection(a, bSets); // 返回值为:XSet(2) {'1.编写PRD文档','3.产品验收'}- 完善
static union方法,实现并集计算,实现所有任务的展示。该方法接收 1 个或多个参数,参数a为类型为XSet的集合,参数bSets将剩余的参数收集到元素类型为XSet的数组,返回值为a和bSets中所有集合的并集集合,类型为XSet。
示例如下:
let a = new XSet(['1.编写PRD文档', '2.页面走查','3.产品验收', '4.测试用例编写']); let bSets = [new XSet(['1.编写PRD文档', '2.页面走查','3.产品验收']), new XSet(['4.测试用例编写', '5.接口测试', '6.整体测试'])];XSet.union(a, bSets); // 返回值为:XSet(6) {'1.编写PRD文档', '2.页面走查','3.产品验收','4.测试用例编写', '5.接口测试', '6.整体测试'} - 完善

三、需求分析
1. 差集计算(static difference 方法)
实现独立任务的展示。该方法接收两个 XSet 类型的集合 a 和 b,返回 a 和 b 的差集集合,即包含在集合 a 但不包含在集合 b 内的元素的集合,返回值类型为 XSet。
2. 交集计算(static intersection 方法)
实现配合任务的展示。该方法接收一个 XSet 类型的集合 a 和一个元素类型为 XSet 的二维数组 bSets,返回 a 和 bSets 中所有集合的交集集合,即 a 集合和 bSets 中多个集合共有的元素构成的集合,返回值类型为 XSet。
3. 并集计算(static union 方法)
实现所有任务的展示。该方法接收一个 XSet 类型的集合 a 和一个元素类型为 XSet 的数组 bSets,返回 a 和 bSets 中所有集合的并集集合,返回值类型为 XSet。
四、代码实现
1. 差集计算(static difference 方法)
static difference(a, b) {return new XSet([...a].filter((item) => ![...b].includes(item)));
}
- 实现思路
- 首先使用扩展运算符
...将集合a和b转换为数组。 - 然后使用
filter方法过滤出数组a中不在数组b中的元素。 - 最后将过滤后的数组作为参数传递给
XSet构造函数,创建一个新的XSet集合并返回。
- 首先使用扩展运算符
2. 交集计算(static intersection 方法)
static intersection(a, ...bSets) {const allSubSets = bSets.flat();const intersection = [...a].filter(item =>allSubSets.every(subSet => subSet.has(item)));return new XSet(intersection);
}
- 实现思路
- 使用
flat方法将bSets数组展平,得到所有的子集合。 - 使用扩展运算符
...将集合a转换为数组。 - 使用
filter方法过滤出数组a中同时存在于所有子集合中的元素。这里使用every方法来检查每个子集合是否都包含该元素。 - 最后将过滤后的数组作为参数传递给
XSet构造函数,创建一个新的XSet集合并返回。
- 使用
3. 并集计算(static union 方法)
static union(a, ...bSets) {const resultSet = new XSet(a);for (const bSet of bSets.flat()) {for (const item of bSet) {resultSet.add(item);}}return resultSet;
}
- 实现思路
- 创建一个新的
XSet集合resultSet,并将集合a的元素添加到其中。 - 使用
flat方法将bSets数组展平,得到所有的子集合。 - 遍历每个子集合,将其中的元素依次添加到
resultSet中。由于Set类型会自动去重,所以重复的元素不会被重复添加。 - 最后返回
resultSet。
- 创建一个新的
五、测试示例
1. 差集计算示例
let a = new XSet(['1.编写PRD文档', '2.页面走查', '3.产品验收', '4.测试用例编写']);
let b = new XSet(['1.编写PRD文档']);
XSet.difference(a, b); // 返回值为: XSet(3) {'2.页面走查', '3.产品验收', '4.测试用例编写'}
2. 交集计算示例
let a = new XSet(['1.编写PRD文档', '2.页面走查', '3.产品验收', '4.测试用例编写']);
let bSets = [[new XSet(['1.编写PRD文档', '2.页面走查', '3.产品验收']), new XSet(['1.编写PRD文档', '4.测试用例编写', '3.产品验收'])]];
XSet.intersection(a, bSets); // 返回值为:XSet(2) {'1.编写PRD文档', '3.产品验收'}
3. 并集计算示例
let a = new XSet(['1.编写PRD文档', '2.页面走查', '3.产品验收', '4.测试用例编写']);
let bSets = [new XSet(['1.编写PRD文档', '2.页面走查', '3.产品验收']), new XSet(['4.测试用例编写', '5.接口测试', '6.整体测试'])];
XSet.union(a, bSets); // 返回值为:XSet(6) {'1.编写PRD文档', '2.页面走查', '3.产品验收', '4.测试用例编写', '5.接口测试', '6.整体测试'}
通过以上实现,完成了项目管理中任务整理所需的集合运算,能够准确地展示独立任务、配合任务和所有任务。
六、补充知识(数组和函数的常用方法)
数组常用方法(重要)
学习方法:全部都过一遍,后边做的时候,有个思路,再来找方法咋用
1. 添加和删除元素
push():将一个或多个元素添加到数组的末尾,返回新的数组长度。pop():删除数组的最后一个元素,返回删除的元素。shift():删除数组的第一个元素,返回删除的元素。unshift():将一个或多个元素添加到数组的开头,返回新的数组长度。
2. 遍历和操作数组元素
forEach():对数组中的每个元素执行一个回调函数。map():创建一个新数组,数组中的元素是通过调用提供的函数处理原数组中的每个元素后的结果。filter():创建一个新数组,包含所有通过提供函数测试的元素。find():返回数组中第一个满足条件的元素,找不到则返回undefined。findIndex():返回数组中第一个满足条件的元素的索引,找不到则返回-1。some():检查数组中是否至少有一个元素满足提供的测试函数,返回布尔值。every():检查数组中的每个元素是否都满足提供的测试函数,返回布尔值。
3. 排序和反转
sort():按默认顺序对数组进行排序,或者根据提供的函数进行自定义排序。reverse():将数组的顺序颠倒。
4. 合并和拆分数组
concat():合并两个或多个数组,返回一个新数组。join():将数组的所有元素连接成一个字符串,元素之间可以用指定的分隔符。slice():返回数组的一个浅拷贝,从指定的开始索引到结束索引(不包括结束索引)。splice():从数组中添加或删除元素,并返回被删除的元素。
5.转换和遍历数组
toString():将数组转换为字符串,元素之间用逗号分隔。flat():将嵌套的数组“拍平”到指定的深度。flatMap():先使用映射函数映射每个元素,再将结果“拍平”到一个新数组。
6. 其他常用方法
includes():检查数组中是否包含指定的元素,返回布尔值。indexOf():返回数组中第一次出现指定元素的索引,找不到时返回-1。lastIndexOf():返回数组中最后一次出现指定元素的索引,找不到时返回-1。reduce():对数组的所有元素执行指定的回调函数,并返回一个最终值。reduceRight():与reduce()相似,但从数组的右端开始执行回调函数。
对象常用方法(重要)
记忆方法同上
1. 获取和设置对象属性
Object.keys():返回对象的所有可枚举属性的键名组成的数组。Object.values():返回对象的所有可枚举属性的值组成的数组。Object.entries():返回一个数组,其中每个元素是一个包含对象属性[key, value]的数组。Object.assign():将一个或多个源对象的可枚举属性复制到目标对象,返回目标对象。
2. 对象转换
JSON.stringify():将对象转换为 JSON 字符串。
举属性的键名组成的数组。Object.values():返回对象的所有可枚举属性的值组成的数组。Object.entries():返回一个数组,其中每个元素是一个包含对象属性[key, value]的数组。Object.assign():将一个或多个源对象的可枚举属性复制到目标对象,返回目标对象。
2. 对象转换
JSON.stringify():将对象转换为 JSON 字符串。JSON.parse():将 JSON 字符串转换为 JavaScript 对象。
