目录
- 第6章 JS集合与映射在 WPS 的应用
- 6-1 集合的创建(实例:唯一值提取)
- 示例代码
- 详细解析
- Excel 环境模拟说明
- 6-2 集合的不重复特性应用(案例:提取唯一值记录)
- 示例代码
- 详细解析
- 案例说明
- 6-3 集合成员添加与删除
- 示例代码
- 代码解析
- 直观示意(Excel 模拟表格)
- 6-4 集合成员添加与删除应用(不重复随机数)
- 示例代码
- 代码解析
- 直观示意(Excel 模拟表格)
- 6-5 集合成员迭代(随机生成试题)
- 示例代码
- 代码解析
- 模拟 Excel 题库展示
- 6-6 并集:数组完成并集
- 方法 1:直接使用数组展开与 Set 构造
- 代码示例
- 详细说明
- 方法 2:对嵌套数组进行扁平化后取并集
- 代码示例
- 详细说明
- 方法 3:利用 Excel 单元格区域数据进行并集计算
- 代码示例
- 详细说明
- 6-7 交集:数组完成交集
- 方法 1:数组交集(利用 filter 与 includes)
- 代码示例
- 详细说明
- 方法 2:集合交集(利用 Set 与 filter)
- 代码示例
- 详细说明
- 实例:统计3列同时出现的姓名
- 代码示例
- 详细说明
- 6-8 差集:数组完成差集
- 方法 1:计算单值差集
- 代码示例
- 详细说明
- 方法 2:计算数组差集(针对数组元素为数组)
- 代码示例
- 详细说明
- 实例:获取未完成订单
- 代码示例
- 详细说明
- 6-9 映射的添加、修改、删除
- 代码示例
- 详细说明
- 6-10 映射应用:最后 1 条记录 & 第 1 条记录获取
- 获取最后 1 条记录
- 代码示例
- 详细说明
- 获取第 1 条记录
- 代码示例
- 详细说明
- 6-11 映射中键值的循环
- 代码示例(方式1:for-of 循环)
- 代码示例(方式2:forEach 遍历)
- 详细说明
- 6-12 实例1:按字段分组求和
- 代码示例
- 详细说明
- 6-13 实例2:拆分记录到表格
- 代码示例
- 详细说明
第6章 JS集合与映射在 WPS 的应用
本章主要介绍如何在 WPS 中利用 JavaScript 的集合(Set)和映射(Map)对象来处理 Excel 数据。通过这一章,你将学会如何利用集合的唯一性、迭代以及集合和数组之间的互相转换操作,以实现数据去重、并集、交集、差集等常见需求。同时还将介绍映射操作、分组求和和记录拆分等技巧。
由于 WPS JS 宏编程的环境与标准 JavaScript 基本一致,本章中提供的案例既讲解了语法细节,也结合实际业务场景(如提取唯一值、生成不重复随机数、组卷等),帮助开发者编写出高效、易读的代码。
所有章节教程word文件可以点击如下链接获取
wps-excel办公+JS宏编程教程基础到进阶+函数使用手册
6-1 集合的创建(实例:唯一值提取)
在这一节中,我们使用 ES6 中的 Set 对象来创建集合,并利用其不允许重复的特性提取唯一值。下面的示例演示了如何从数组或字符串构造集合,再将集合转换为数组,以及如何统计集合中的元素个数。
示例代码
function test(){// 创建一个空集合, Set 的数据类型:Set<any>// 用于存储任意类型的数据(例如字符串、数字等)var s1 = new Set(); // 创建一个空集合// 通过传入数组来构造集合,数组中的重复元素会被自动去除// 输入示例:["a", "b", "c", "b"],输出集合中元素为: "a", "b", "c"var s2 = new Set(["a", "b", "c", "b"]);// 利用字符串(可迭代对象)创建集合,字符串中每个字符被视为一个元素// 输入示例:"aabbbcddff",输出集合中元素为: "a", "b", "c", "d", "f"var s3 = new Set("aabbbcddff");// 使用扩展操作符 [...] 将集合转换成数组// 这样就可以得到唯一值数组,输入例子与 s2 类似// 输出示例:["a", "b", "c"]var s4 = [...new Set(["a", "b", "c", "b"])];// 获取集合 s3 的元素个数,Set.prototype.size 属性返回集合中唯一值的数量// 例如,s3 的唯一字符个数为 5var n = s3.size; // 统计集合的元素个数// 调试输出到控制台(在 WPS 中可以用 Console.log 来输出调试信息)Console.log("s2集合内容:", [...s2]);Console.log("s3集合内容:", [...s3]);Console.log("s4转换数组结果:", s4);Console.log("s3的元素个数 n:", n);
}
详细解析
-
函数定义
- 函数名称:
test
- 输入:无参数(
void
类型) - 输出:无返回值,通过调试输出展示结果
- 函数名称:
-
变量与数据结构解析
s1
:一个空的 Set 集合,初始时不包含任何元素。s2
:利用数组["a", "b", "c", "b"]
构造的集合,因集合自动去重,最终存储的值为"a"
、"b"
和"c"
。s3
:由字符串"aabbbcddff"
构造,字符串作为可迭代对象,其每个字符作为单个元素加入集合;最终得到的集合包含"a"
、"b"
、"c"
、"d"
和"f"
。s4
:将 Set 对象转换成数组,可以方便后续使用数组方法进行操作。n
:记录集合s3
的元素数量。通过.size
属性获取,类型为 number,示例值为 5。
-
代码注释说明
每一行代码均附带了详细注释,描述了该行代码的功能、变量类型以及处理的数据示例,有助于初学者理解代码的逻辑。 -
调试输出
使用Console.log
输出每一步操作的结果,方便开发者在 WPS 宏环境中进行结果查看(需要在 WPS 调试窗口中查看输出)。
Excel 环境模拟说明
在实际操作中,很多案例会结合 Excel 单元格数据。例如,如果你要提取一列中的唯一记录,你可以将该列数据读入数组,然后利用 Set 的去重特性进行处理。
假设 Excel 中 A 列有如下数据(以表格形式表示):
行号 | 数据 |
---|---|
2 | apple |
3 | banana |
4 | apple |
5 | orange |
利用类似以下代码:
var arr = Range("A2:A5").Value();
var uniqueArr = [...new Set(arr)];
最终 uniqueArr
将为 ["apple", "banana", "orange"]
。这种方法简洁高效,极大地提升了数据处理效率。
6-2 集合的不重复特性应用(案例:提取唯一值记录)
在本节中,基于前面的集合创建,进一步利用集合的唯一性来提取 Excel 范围内具有不重复特性的记录。这里以提取每天仅保留一笔销售记录为例,演示如何通过集合操作实现“唯一值记录”的抽取。
示例代码
function test(){// 从工作表中获取 A2:E16 范围内的数据,并存入二维数组 arr// 假设每一行的第一列数据为销售日期,其余列为销售详情var arr = Range("a2:e16").Value();// 利用 map 将数组中每一行的第一个元素(日期)提取出来,// 然后用 Set 去除重复的日期,最后利用扩展操作符转换为数组// DateArr 的类型为 Array<any>,其中元素为日期字符串或数值,例如 ["2023-01-01", "2023-01-02", ...]var DateArr = [...new Set(arr.map(ar => ar[0]))];// 对于每个唯一日期,在原始数组中查找第一条符合该日期的记录// arr.find 遍历每一行,找到符合条件的记录(第一条出现的记录)// NewArr 类型为 Array<any[]>,每个元素都是一行记录var NewArr = DateArr.map(d => arr.find(ar => ar[0] == d));// 将结果数据写入工作表,从 G2 单元格开始,写入的数据区域大小为 NewArr 的行数和列数Range("g2").Resize(NewArr.length, NewArr[0].length).Value2 = NewArr;// 调试输出,打印唯一日期数组和结果数据,用于验证数据正确性Console.log("唯一日期列表:", DateArr);Console.log("唯一日期对应的记录:", NewArr);
}
详细解析
-
函数定义
- 函数名称:
test
- 输入:无参数
- 输出:无返回值,通过在 Excel 中写入数据实现结果呈现
- 函数名称:
-
变量与数据结构解析
arr
:二维数组,包含从 Excel 单元格范围A2:E16
获取的所有数据,每个元素为一行数据。- 示例格式:
[ [日期, 数值1, 数值2, ...], [...], ... ]
- 示例格式:
DateArr
:由arr.map
提取第一列(日期)后,用 Set 去重生成的唯一日期数组。- 示例结果:
["2023-01-01", "2023-01-02", "2023-01-03"]
- 示例结果:
NewArr
:利用DateArr.map
遍历每个唯一日期,从原数组中查找该日期对应的第一条记录。- 示例格式:
[ [唯一日期1, 数值, 数值, ...], [唯一日期2, 数值, 数值, ...] ]
- 示例格式:
-
算法核心
- 利用 Set 对象实现了数据去重,保证了提取的日期列表中不存在重复值。
- 使用
Array.prototype.find
方法确保每个日期只提取第一条记录,符合“每天仅一笔记录”的需求。
-
数据输出操作
- 通过
Range("g2").Resize(...)
方法将结果写回工作表,便于进一步的数据展示和分析。 - 此处涉及 Excel 数据区间的动态调整操作,保证了写入区域与数据量匹配。
- 通过
案例说明
假设你有一个销售记录表,其中 A 列为日期,B~E 列为销售数据。如果表中存在多个相同日期的记录,此代码将提取出每个日期仅保留第一笔记录。
例如,假设 Excel 数据如下(以表格形式描述):
行号 | 日期 | 销售额 | 产品ID | 区域 | 备注 |
---|---|---|---|---|---|
2 | 2023-05-01 | 100 | P001 | 华东 | 首笔订单 |
3 | 2023-05-01 | 200 | P002 | 华东 | 重复订单 |
4 | 2023-05-02 | 150 | P003 | 华南 | 首笔订单 |
5 | 2023-05-03 | 180 | P004 | 华北 | 首笔订单 |
6 | 2023-05-02 | 220 | P005 | 华南 | 重复订单 |
运行此代码后,从 G2 开始输出的结果将为:
行号 | 日期 | 销售额 | 产品ID | 区域 | 备注 |
---|---|---|---|---|---|
2 | 2023-05-01 | 100 | P001 | 华东 | 首笔订单 |
3 | 2023-05-02 | 150 | P003 | 华南 | 首笔订单 |
4 | 2023-05-03 | 180 | P004 | 华北 | 首笔订单 |
这种方法能够有效过滤重复的日期记录,确保数据的唯一性和清晰度。
6-3 集合成员添加与删除
在这一节中,我们介绍如何使用 Set 对象对集合的成员进行添加、删除、以及清空操作,这在数据处理过程中非常常见。以下示例展示了如何逐步对集合进行操作,并利用注释说明每一行代码的目的。
示例代码
function test1(){// 1. 创建一个空集合 s,类型为 Set<any>var s = new Set();// 2. 使用 add() 方法添加成员 "a" 到集合// s 的内容由 {} 变为 { "a" }s.add("a");// 3. 添加数字 100 到集合// 目前 s 中包含两个元素:{ "a", 100 }s.add(100);// 4. 添加数字 200 到集合// 现在 s 中的元素为:{ "a", 100, 200 }s.add(200);// 5. 使用 delete() 方法删除集合中值为 "a" 的成员// 执行后 s 将只保留 { 100, 200 }s.delete("a");// 6. 调用 clear() 方法清空集合中所有的成员// 执行后 s 为一个空集合 {}s.clear();// 调试输出:打印集合当前大小,期望输出 0Console.log("集合 s 的当前大小:", s.size);
}
代码解析
-
函数定义
- 名称:
test1
- 输入:无参数
- 输出:无返回值,最终通过调试信息展示操作结果
- 名称:
-
每一行代码说明
- 创建空集合
s
,用于存储任意类型数据。 s.add("a")
将字符串"a"
添加到集合中。s.add(100)
向集合中添加数字100
。s.add(200)
向集合中添加数字200
。s.delete("a")
从集合中删除字符串"a"
。s.clear()
清空整个集合,删除所有成员。
- 创建空集合
直观示意(Excel 模拟表格)
下面以模拟表格方式展示各步骤后集合的内容。注意:这里的“集合内容”仅为逻辑展示,并非 Excel 实际单元格数据,但我们采用了行标、列标以及网格边框的形式使其直观呈现。
操作步骤 | 集合内容 |
---|---|
初始状态 | {} |
添加 “a” | {“a”} |
添加 100 | {“a”, 100} |
添加 200 | {“a”, 100, 200} |
删除 “a” | {100, 200} |
清空集合 | {} |
6-4 集合成员添加与删除应用(不重复随机数)
本节介绍如何利用 Set 的不重复特性生成不重复的随机数。常见应用场景例如抽奖、随机分组或生成随机试卷题目时需要确保数字不重复。
示例代码
示例1:生成一定数量的不重复随机数,范围在 1 到 20。
function rnd1(){// 创建一个空集合 s,用于存储生成的随机数var s = new Set();// 循环直到集合 s 中的元素数量达到 10 个while (true){// 使用 WorksheetFunction.RandBetween(1, 20) 生成1至20间的随机数var num = WorksheetFunction.RandBetween(1, 20);// 将随机数添加到集合中,若重复则自动去重s.add(num);// 当集合大小达到10时跳出循环if (s.size == 10){ break; }}// 最终 s 包含10个唯一的随机数Console.log("生成的随机数集合:", [...s]);
}
示例2:自定义函数 rnd(counter, start, end)
,可以生成指定个数(counter)的不重复随机数,并返回数组。
function rnd(counter, start, end){// 确保请求的随机数数量不超过区间内可能的数字总数if (counter <= end - start + 1){// 初始化空集合 svar s = new Set(