
个人主页杨利杰YJlio❄️个人专栏《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》《超简单用Python让Excel飞起来》让复杂的事情更简单让重复的工作自动化文章目录前言一组工单要先说清操作目的一、先定义数组元素的结构二、for...of逐项执行动作三、map从元素生成新的值四、filter保留符合条件的记录五、find找到第一条或返回 undefined六、先筛选再转换显示文本七、新数组与原对象可能共享引用八、记录空结果、顺序与字段变化学习总结参考资料前言一组工单要先说清操作目的大家好我是杨利杰 YJlio。上一篇把一条工单组织成对象。这篇把记录放进数组分别练习逐项处理、提取标题、筛选未完成记录和查找编号。我的做法是先问“需要什么结果”再选择for...of、map、filter或find。这是 HarmonyOS 7.0 学习笔记第 07 篇。返回新数组不等于深拷贝查找结果也可能不存在。环境项实际记录DevEco Studio待填写SDK/API与ArkTS工具链待填写工程当前 ArkTS 练习工程数据来源内存中的三条示例记录本文配图为知识示意图。示例没有连接网络、数据库或真实工单系统也没有预先填写本机日志与构建结果。一、先定义数组元素的结构为集中练习数组我使用只包含列表所需字段的TicketListItem。它与上一篇完整的Ticket分开命名不把三字段对象当作五字段模型。enumTicketStatus{New0,Processing1,Resolved2}interfaceTicketListItem{id:string;title:string;status:TicketStatus;}consttickets:TicketListItem[][{id:T-1001,title:无法连接办公网络,status:TicketStatus.New},{id:T-1002,title:打印机无法出纸,status:TicketStatus.Processing},{id:T-1003,title:账号已解锁,status:TicketStatus.Resolved}];TicketListItem[]说明元素的类型。标识、标题和状态都来自本篇练习数据外部数据仍需解析和校验。这里使用普通数组不是跨并发任务的collections.Array。华为共享容器说明列出了共享容器与原生容器的区别阅读接口时要先确认是哪一种。二、for…of逐项执行动作需要记录每条工单或累计结果时我先使用能直接读出目的的循环。for(constitemoftickets){console.info(${item.id}:${item.title});}循环每次取得当前元素再执行方法体。这里仅输出文本不修改元素也不改变数组结构。这不是已经运行过的日志截图。实际执行位置按工程组织方式确定构建与日志记录都需要本机完成。三、map从元素生成新的值只需要标题列表时我用map表达“每条工单转成一个标题”。consttitles:string[]tickets.map((item:TicketListItem):stringitem.title);本例是稠密数组回调只读取标题结果应按原顺序包含三个标题。空数组映射后仍是空数组。这个新数组保存字符串没有继续保留完整工单字段。如果详情页需要标识、状态等信息应保留完整对象不能从一份标题数组猜回记录。map本身不要求修改源数组但回调仍可以产生副作用。本篇保持回调只读避免把转换和修改混在一起。四、filter保留符合条件的记录要得到未完成工单我用状态条件排除Resolved而不是删除原数组中的元素。constactive:TicketListItem[]tickets.filter((item:TicketListItem):booleanitem.status!TicketStatus.Resolved);按示例推导结果保留T-1001和T-1002顺序与原数组一致。它不会负责排序没有匹配项时结果可以是空数组。这些是代码阅读得到的预期不是本机运行证据。实际数量与内容仍需记录。筛选结果为空通常是正常业务结果不应假设至少有一条记录。五、find找到第一条或返回 undefined查询特定标识时我用find。它返回第一个匹配元素找不到时返回undefined。constselected:TicketListItem|undefinedtickets.find((item:TicketListItem):booleanitem.idT-1002);if(selectedundefined){console.info(未找到工单);}else{console.info(selected.title);}查找第一条匹配项不等于检查标识唯一。如果重复标识会造成问题需要在数据层另外保证唯一性。我也会用不存在的T-9999练习未找到分支。不要为了消除提示使用非空断言否则无记录场景仍然没有处理。六、先筛选再转换显示文本当目标是“未完成工单的显示文本”可以把筛选和转换按步骤连接起来。constlabels:string[]active.map((item:TicketListItem):string${item.id}-${item.title});for(constlabeloflabels){console.info(label);}这里沿用前面得到的active。筛选负责决定保留哪些记录映射负责决定显示哪些文字每一步的结果类型都明确。不要把这段文本生成逻辑当成 ArkUI 列表渲染。它还没有接入页面状态或组件后续章节再连接界面。七、新数组与原对象可能共享引用我会把“数组容器不同”和“内部对象是否独立”分开观察避免筛选后误改原记录。在本例中filter创建新的数组容器保留下来的仍是原对象find返回的也是原数组中的匹配对象。读取没问题修改属性则可能反映到源记录。因此“操作前后tickets.length没变”只能说明数量没变不能证明所有对象属性都没有变化。观察源数据时数量、顺序和字段值都要看。push、splice和普通数组的sort会改变数组。本篇不在原数组上进行这些操作需要排序时应明确规则和复制范围。浅复制容器仍不会自动深拷贝对象。不要只比较数组长度就认定源数据完全没有变化。八、记录空结果、顺序与字段变化本机实验时我会先记录原数组再逐项运行转换、筛选和查找最后比较数量、顺序和字段。保留模板在合适的逻辑文件或已有执行位置加入示例。构建后记录工具链版本与结果。记录原数组标识顺序和字段值。运行map、filter、find逐项保存真实输出。查询不存在编号确认走未找到分支。比较源数组数量、顺序和字段不要在回调中增加修改操作。操作本篇预期本机实际记录提取标题按原顺序得到三个标题待填写排除已解决状态保留 T-1001、T-1002待填写查找 T-1002返回该记录待填写查找 T-9999undefined待填写比较源数据本例只读回调不修改源数据待填写如果普通数组操作得到正确结果页面却没刷新还要检查当前 ArkUI 状态管理机制。类型正确、集合结果正确与界面更新是不同的核验项。学习总结这篇我用一组工单分别练习遍历、转换、筛选和查找。选择方法前先明确结果类型再处理空数组、未找到和对象引用。发布前补齐本机日志和构建记录。下一篇使用条件分支准备加载、错误、空数据和有数据四种列表状态。参考资料华为开发者联盟ArkTS 语言概览华为开发者文档共享容器与原生容器的区别ECMAScript 规范Array.prototype 方法声明本文为学习示例与练习方法配图为知识示意图实际语法、接口支持、日志和构建结果以当前工程、工具链及官方文档为准。返回顶部