如何遍历JS嵌套对象生成父键对应子键数组的映射对象
问题分析
你的代码核心问题有2个:
isObject1函数没有返回布尔值,导致if (isObject1(value1))判断恒为假,遇到嵌套的f对象时不会触发递归,自然无法写入f对应的子键数组- 原类型判断没有排除数组,会误把数组类型识别为需要处理的对象,额外生成不符合预期的键值对
- 全局变量
keyVal在循环中反复赋值,存在变量污染的隐患
修复后的完整代码
// 类型判断:仅识别纯对象,排除null和数组 const isPureObject = (val: any) => { return typeof val === 'object' && val !== null && !Array.isArray(val); } // 递归生成映射对象的工具函数 function generateParentMap(obj: Record<string, any>, parentKey: string, result: Record<string, string[]>) { // 写入当前父级对应的直属子键数组 result[parentKey] = Object.keys(obj); // 遍历所有子属性 for (const key in obj) { const value = obj[key]; // 如果子属性是纯对象,递归处理 if (isPureObject(value)) { generateParentMap(value, key, result); } } } // 测试用输入对象 let a = { b: { f: { g: "hi", i: "wow" }, e: "hello" }, c: { j: "ola" }, d: { k: ["bonjour","salam"] } } // 调用示例 const res = {}; generateParentMap(a, 'a', res); console.log(res); // 输出结果:{ a: [ 'b', 'c', 'd' ], b: [ 'f', 'e' ], f: [ 'g', 'i' ], c: [ 'j' ], d: [ 'k' ] }
代码修改说明
- 补充了类型判断的返回值,确保嵌套对象可以正确触发递归
- 新增了数组和null的排除逻辑,避免把数组、null误判为需要处理的父级对象
- 移除了全局变量,改为通过参数传递父级键和结果对象,避免变量污染,适配多场景复用
- 不需要手动单独写入根节点的键值对,调用时传入根对象对应的父级名即可
内容的提问来源于stack exchange,提问作者AravindhanBoss
相关产品推荐
相关产品推荐

