如何递归返回对象及嵌套对象的带完整路径的键数组?
递归提取嵌套对象/数组的完整键路径实现方案
针对你的需求,我写了一个适配任意嵌套层级的递归实现,完美匹配你给出的示例输出:
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));
逻辑说明
- 递归核心:通过内部函数
traverse处理嵌套结构,每次接收当前值和父级路径前缀,自动向下遍历所有层级,直到遇到基本类型或null为止。 - 类型区分处理:
- 数组:先把数组本身的路径加入结果,再递归处理每个数组元素(索引作为键);
- 基本类型:直接把完整路径加入结果;
- 普通对象:不加入对象自身的路径(比如示例中的
a、d),直接递归处理它的子键;
- 任意嵌套适配:不管对象/数组嵌套多少层,递归都会自动拆解,不会像固定层级循环那样失效。
执行结果
运行后会输出你需要的数组:
[ 'a.b', 'a.q', 'a.q.0', 'a.q.1', 'a.q.2', 'x', 'd.f', 'd.c' ]
内容的提问来源于stack exchange,提问作者Павел Грушак
相关产品推荐
相关产品推荐

