You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:15:03