【HarmonyOS NEXT】如何给未知类型对象定义类型并使用递归打印所有的Key
2024-12-25 15:59:47
8次阅读
0个评论
关键词:嵌套对象、类型、递归、未知类型
目录
在鸿蒙应用开发中,所有的数据都必须定义类型,且不存在 any 类型,那么我们当遇到 key 值可能随时变化的情况时,如何获取该 object 中每一个 key 对应的数据呢?
本期以如下 object 为例,下方对象报文可能会根据使用时间或服务商的变化,"153" 字段可能会变成 "278" 等未知字符串、"5G" 字段可能会变成 "4G",那么当 key 值不断变化的同时应如何获取 "isShow" 字段的 "Y" 值?
"cfg": {
"153": {
"5G": {
"isShow": "Y"
}
}
}
使用 Record 与 ESObject 定义未知对象类型
在鸿蒙中,已经不支持索引签名的类型写法(如:[key: string]: string | number),所以需要使用提供的 Record 与 ESObject 类型,在复杂类型场景使用,所以我们可以直接嵌套定义如下类型即可。
type objType = Record<string, Record<string, Record<string, Record<string, string>>>>
let obj: objType = {
"cfg": {
"153": {
"5G": {
"isShow": "Y"
}
}
}
}
注:其他明确 key 与 value 类型的场景不建议使用 Record 与 ESObject 类型,养成良好开发习惯,标注好对应数据类型。
递归打印未知类型对象的key
鸿蒙中不支持 for... in 形式的打印,所以对于该种复杂嵌套对象,我们可以自行编写简单的 for 循环,递归调用即可。
/**
* 打印对象所有的 key
* @param obj
*/
handleKey(obj: objType | string) {
let keys = Object.keys(obj);
for (let i = 0; i < keys.length; i++) {
console.log("luvi > " + keys[i]);
if (typeof obj[keys[i]] === "object") {
this.handleKey(obj[keys[i]])
continue
}
// 打印 isShow 最终值
if (keys[i] === "isShow") {
console.log("luvi > isShow最终值:" + obj[keys[i]]);
break
}
}
}
// 调用
this.handleKey(obj)
输出结果:
编辑
该篇文章为开发时临时记录,开发经验如上,若对 TS 基础类型写法存在疑惑可查看 TS 官方文档,Record 与 ESObject 类型为鸿蒙的 ArkTS 类型,详细用法可前往 HarmonyOS 开发者官网了解。
00
- 2回答
- 0粉丝
- 0关注
相关话题
- 【HarmonyOS NEXT】ArkTs数据类型解析与使用
- 探索如何更有效的使用DevEcoStudio开发工具
- 如何加载和使用自定义字体
- 列出文件夹下所有文件名
- 【HarmonyOS NEXT】url地址key value解析器
- 如何获取状态管理框架代理前的原始对象
- HarmonyOS Next 如何优雅的编写注释
- 如何调用系统拍照并获取图片
- 【HarmonyOS NEXT】 离线加载web资源,并实现web资源更新
- [HarmonyOS] 鸿蒙中自定义SO库以及使用
- OpenHarmony: 如何通过路由跳转到一个只有页面没有UIAbility的模块
- OpenHarmony: 如何指定对象属性参与序列化
- HarmonyOS NEXT应用开发指南:开屏广告的使用
- 【HarmonyOS Next开发】Navigation使用
- 【HarmonyOS Next开发】:ListItemGroup使用