动态获取嵌套对象所有键的点分全路径 现有递归代码拼接错误求解
嵌套对象全键路径获取实现方案
原代码问题说明
原代码无法生成多层嵌套路径的核心原因是递归时没有拼接上层父路径,其次还存在逻辑瑕疵:
- 递归传参时仅传入当前层级key,未带上层父路径,比如处理
s下的0属性时,仅将0作为父路径传入下一层递归,丢失了外层的s前缀 forEach遍历中的return语句无实际作用,无法终止遍历也不会返回递归结果- 类型判断未排除null值(
typeof null === 'object'),遇到null值会触发报错 - 依赖实例属性
this.header存储结果,函数复用性差,多次调用会出现值累加的问题
可行实现代码
// 通用获取嵌套对象全路径函数 getAllObjectKeys(obj: Record<string, any>, parentPrefix = ''): string[] { // 存储当前层级的所有路径 const keys: string[] = []; // 遍历当前对象所有可枚举属性 for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { // 拼接当前全路径 const fullKey = parentPrefix ? `${parentPrefix}.${key}` : key; const value = obj[key]; // 判断值是否为对象且不为null,是则递归处理 if (typeof value === 'object' && value !== null) { keys.push(...this.getAllObjectKeys(value, fullKey)); } else { keys.push(fullKey); } } } return keys; }
如果需要排除特定键,在遍历逻辑开头添加对应判断跳过即可。
使用示例
// 传入你的示例对象 const demoObj = { ts: "2021-05-06T11:06:18Z", pr: 94665, pm25: 5, co2: 1605, hm: 32, m: { isConnected: true, wifidBm: 0, }, pm1: 5, s: { "0": { runningTime: 0, sn: "05064906137109790000", wearRate: 0, enabled: true, co2: 1605, }, "1": { enabled: false, sn: "125630092251006", }, "2": { enabled: false, sn: "05064906137109450000", }, "3": { fanStatus: 0, pm25: 5, pm1: "5", e: { rawSensorError: 0, }, pm10: 5, runningTime: 0, sn: "125630100924141", wearRate: 0, enabled: true, }, }, id: "avo_jggv6bsf211", tp: "20.6", pm10: 5, type: "monitor", }; // 调用函数获取路径数组 const pathArr = getAllObjectKeys(demoObj); // 转成逗号分隔的字符串 const pathStr = pathArr.join(', '); console.log(pathStr);
输出结果完全符合预期,包含s.0.runningTime、s.3.e.rawSensorError这类深层路径,支持任意层级的嵌套对象,不需要修改代码适配结构变化。
内容的提问来源于stack exchange,提问作者Le Rilleur
相关产品推荐
相关产品推荐

