WPS JS宏编程教程(从基础到进阶)-- 第六部分:JS集合与映射在 WPS 的应用

目录


第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 的唯一字符个数为 5
    var 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();

    // 调试输出:打印集合当前大小,期望输出 0
    Console.log("集合 s 的当前大小:", s.size);
}

代码解析

  • 函数定义

    • 名称test1
    • 输入:无参数
    • 输出:无返回值,最终通过调试信息展示操作结果
  • 每一行代码说明

    1. 创建空集合 s,用于存储任意类型数据。
    2. s.add("a") 将字符串 "a" 添加到集合中。
    3. s.add(100) 向集合中添加数字 100
    4. s.add(200) 向集合中添加数字 200
    5. s.delete("a") 从集合中删除字符串 "a"
    6. 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){
   
        // 初始化空集合 s
        var s = new Set(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帮代做

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值