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

如何递归返回对象及嵌套对象的带完整路径的键数组?

递归提取嵌套对象/数组的完整键路径实现方案

针对你的需求,我写了一个适配任意嵌套层级的递归实现,完美匹配你给出的示例输出:

function getFullKeys(target) {
  const result = [];

  // 内部递归函数,处理嵌套结构
  function traverse(current, prefix) {
    if (current == null) return;

    if (typeof current === 'object') {
      // 区分数组和普通对象,获取对应键/索引
      const keys = Array.isArray(current) ? Array.from(current.keys()) : Object.keys(current);
      
      for (const key of keys) {
        const fullPath = prefix ? `${prefix}.${key}` : key;
        const value = current[key];

        if (Array.isArray(value)) {
          // 数组路径加入结果,再递归处理数组元素
          result.push(fullPath);
          traverse(value, fullPath);
        } else if (typeof value !== 'object' || value === null) {
          // 基本类型(字符串/数字/布尔/null)直接加入路径
          result.push(fullPath);
        } else {
          // 普通对象不加入自身路径,直接递归处理子键
          traverse(value, fullPath);
        }
      }
    }
  }

  // 启动遍历,顶层对象无前缀
  traverse(target, '');
  return result;
}

// 测试示例对象
const testObj = {
    a: {
        b: 2,
        q: [0, 3, 4],
    },
    x: true,
    d: { f: null,
         c: 'something' 
        }
};

// 输出符合期望的结果
console.log(getFullKeys(testObj));

逻辑说明

  1. 递归核心:通过内部函数traverse处理嵌套结构,每次接收当前值和父级路径前缀,自动向下遍历所有层级,直到遇到基本类型或null为止。
  2. 类型区分处理:
    • 数组:先把数组本身的路径加入结果,再递归处理每个数组元素(索引作为键);
    • 基本类型:直接把完整路径加入结果;
    • 普通对象:不加入对象自身的路径(比如示例中的a、d),直接递归处理它的子键;
  3. 任意嵌套适配:不管对象/数组嵌套多少层,递归都会自动拆解,不会像固定层级循环那样失效。

执行结果

运行后会输出你需要的数组:

[
  'a.b',   'a.q',
  'a.q.0', 'a.q.1',
  'a.q.2', 'x',
  'd.f',   'd.c'
]

内容的提问来源于stack exchange,提问作者Павел Грушак

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:50:21