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

目录

  • 第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 列有如下数据(以表格形式表示):

行号数据
2apple
3banana
4apple
5orange

利用类似以下代码:

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区域备注
22023-05-01100P001华东首笔订单
32023-05-01200P002华东重复订单
42023-05-02150P003华南首笔订单
52023-05-03180P004华北首笔订单
62023-05-02220P005华南重复订单

运行此代码后,从 G2 开始输出的结果将为:

行号日期销售额产品ID区域备注
22023-05-01100P001华东首笔订单
32023-05-02150P003华南首笔订单
42023-05-03180P004华北首笔订单

这种方法能够有效过滤重复的日期记录,确保数据的唯一性和清晰度。


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
    • 输入:无参数
    • 输出:无返回值,最终通过调试信息展示操作结果
  • 每一行代码说明

    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){// 初始化空集合 svar s = new Set(

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 约束(入门版)

目录 一、约束的基本概念 二、约束演示 三、外键约束 &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;外键约束语法 &#xff08;三&#xff09;删除/更新行为 一、约束的基本概念 1、概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储…

【ISP】ISP pipeline(AI)

ISP Pipeline 全流程概览 ISP&#xff08;Image Signal Processing&#xff0c;图像信号处理&#xff09;流程通常从原始 Bayer 数据出发&#xff0c;经过一系列模块处理&#xff0c;逐步完成图像校正和增强&#xff0c;最终生成用于显示或编码的标准图像。常见处理模块包括&a…

【Rust开发】Rust快速入门,开发出Rust的第一个Hello World

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Google Chrome下载受限制的解决方案【方法指南】

在国内使用网络时&#xff0c;部分用户在尝试访问Google Chrome官网下载谷歌浏览器时&#xff0c;常常遇到网页无法打开或文件下载失败的情况。这种下载受限制的问题多由网络访问政策或DNS解析异常导致。为了正常获取Google Chrome的最新版安装程序&#xff0c;用户需要通过一些…

使用 new EventSource 实现前端实时通信

示例&#xff1a; eventSource单向通信 1. 什么是 EventSource&#xff1f; EventSource 是浏览器提供的一种实现服务器推送&#xff08;Server-Sent Events&#xff0c;简称 SSE&#xff09;功能的 API。它是基于 HTTP 协议的单向通信机制&#xff0c;可以通过服务器将实时数…

Android Input——查找并添加目标窗口(七)

在 Android 输入系统中,InputDispatcher 的核心职责之一是将输入事件正确地传递到目标窗口。上一篇文章我们介绍到 InputDispatcher 事件分发调用到 findFocusedWindowTargetsLocked() 函数查找焦点窗口,并将焦点窗口添加到目标窗口,这里我们继续往下看。 一、获取焦点窗口…

Spring Boot中Spring MVC相关配置的详细描述及表格总结

以下是Spring Boot中Spring MVC相关配置的详细描述及表格总结&#xff1a; Spring MVC 配置项详解 1. 异步请求配置 spring.mvc.async.request-timeout 描述&#xff1a;设置异步请求的超时时间&#xff08;单位&#xff1a;毫秒&#xff09;。默认值&#xff1a;未设置&…

HTTP GET 和 POST 请求有什么区别

HTTP 的 GET 和 POST 请求是两种常见的 HTTP 请求方法&#xff0c;它们有不同的特点和应用场景。以下是它们的主要区别&#xff1a; 1. 用途 GET&#xff1a;用于从服务器获取数据或资源。GET 请求会附带查询参数在 URL 中&#xff0c;通常用于请求数据&#xff0c;如加载网页…

从入门到精通【MySQL】 联合查询

文章目录 &#x1f4d5;摘要&#x1f4d5;1. 多表联合查询时MySQL内部原理✏️1.1 实例&#xff1a;一个完整的联合查询过程 &#x1f4d5;2. 内连接&#x1f4d5;3. 外连接&#x1f4d5;4. 自连接&#x1f4d5;5. 子查询✏️5.1 单行子查询✏️5.2 多行子查询✏️5.3 多列子查…

高可用之战:Redis Sentinal(哨兵模式)

参考&#xff1a;Redis系列24&#xff1a;Redis使用规范 - Hello-Brand - 博客园 1 背景 在我们的《Redis高可用之战&#xff1a;主从架构》篇章中&#xff0c;介绍了Redis的主从架构模式&#xff0c;可以有效的提升Redis服务的可用性&#xff0c;减少甚至避免Redis服务发生完…

加密≠安全:文件夹密码遗忘背后的数据丢失风险与应对

在数字化时代&#xff0c;保护个人隐私和数据安全变得尤为重要。许多人选择对重要文件夹进行加密&#xff0c;以防止未经授权的访问。然而&#xff0c;一个常见且令人头疼的问题也随之而来——文件夹加密密码遗忘。当你突然发现自己无法访问那些加密的文件夹时&#xff0c;那种…

WPS宏开发手册——附录

目录 系列文章7、附录 系列文章 使用、工程、模块介绍 JSA语法 JSA语法练习题 Excel常用Api Excel实战 常见问题 附录 7、附录 颜色序列&#xff1a;在excel中设置颜色&#xff0c;只能设置颜色序号&#xff0c;不能直接设置rgb颜色 1、黑色 (Black)…

C++基础精讲-02

文章目录 1.C/C申请、释放堆空间的方式对比1.1C语言申请、释放堆空间1.2C申请、释放堆空间1.2.1 new表达式申请数组空间 1.3回收空间时的注意事项1.4malloc/free 和 new/delete 的区别 2.引用2.1 引用的概念2.2 引用的本质2.3 引用与指针的联系与区别2.4 引用的使用场景2.4.1 引…

Spring Boot MongoDB 分页工具类封装 (新手指南)

Spring Boot MongoDB 分页工具类封装 (新手指南) 目录 引言&#xff1a;为何需要分页工具类&#xff1f;工具类一&#xff1a;PaginationUtils - 简化 Pageable 创建 设计目标代码实现 (PaginationUtils.java)如何使用 PaginationUtils 工具类二&#xff1a;PageResponse<…

MyBatis的缓存、逆向工程、使用PageHelper、使用PageHelper

一、MyBatis的缓存 缓存&#xff1a;cache 缓存的作用&#xff1a;通过减少IO的方式&#xff0c;来提高程序的执行效率。 mybatis的缓存&#xff1a;将select语句的查询结果放到缓存&#xff08;内存&#xff09;当中&#xff0c;下一次还是这条select语句的话&#xff0c;直…

java中的JNI调用c库

1. 简单demo 如果是在某个项目中有包名就需要自己找ai问问去改写下cmd命令去编译执行等 java文件&#xff08;HelloJNI.java&#xff09; public class HelloJNI {// 声明 native 方法public native void sayHello();// 加载本地库static {System.loadLibrary("hello&quo…

人工智能:GPT技术应用与未来展望

GPT(Generative Pre-trained Transformer)作为自然语言处理领域的代表性技术,近年来在各行业的实际应用中展现出广泛潜力。结合其技术特性与行业需求,以下是GPT的主要应用场景、案例分析及未来挑战的总结: 一、核心应用领域与案例 文本生成与内容创作 自动化内容生产:GPT…

前端笔记-ECMAScript语法概览

更多详细可以查看1.1 ES6 教程 | 菜鸟教程 这里我将大概记录ES与JS大概不一样的部分&#xff0c;方便联合记忆。 历史与关系 ECMAScript&#xff1a;是一种由 Ecma 国际组织制定的脚本语言规范&#xff0c;它是 JavaScript 的标准化版本。ECMAScript 为 JavaScript 提供了语…

操作主机的管理

1.在AD林范围内&#xff0c;有哪几个操作主机角色 架构主机&#xff08;Schema Master&#xff09; 功能&#xff1a;负责整个AD林中所有对象和属性的定义&#xff0c;是唯一可以更新目录架构的DC。架构更新会从架构主机复制到目录林中的所有其他域控制器。 作用范围&#xf…

【Linux】网络编程

目录 端口号 网络字节序 socket编程 接口 sockaddr结构 udp网络程序 创建套接字 绑定 接收 发送 客户端需要绑定吗&#xff1f; 客户端执行方法 本地环回地址 终端文件 代码 tcp网络程序 SOCK_STREAM 监听 查询网络信息 获取新连接 地址转换函数 客户端绑…