求助:至少6层嵌套(含数组)的对象键值对递归遍历解决方案
深度嵌套对象(含数组)的键值对遍历解决方案
我看了你写的递归函数,问题出在你并没有真正实现递归——你只是手动做了两层遍历,而且没考虑数组的特殊情况(毕竟typeof []也会返回"object")。咱们来改一下,让它能处理任意层级的嵌套对象和数组:
首先明确几个核心要点:
- 要区分普通对象和数组(数组也是对象,但遍历逻辑不一样)
- 递归的核心是遇到嵌套结构时再次调用自身,而不是手动写多层循环
- 要排除
null(因为typeof null === "object",但它不是我们要遍历的有效结构)
下面是修正后的递归函数:
function keyValuePairFunc(item, parentKey = "") { // 处理数组:遍历每个元素,用索引拼接键路径 if (Array.isArray(item)) { item.forEach((element, index) => { const currentKey = parentKey ? `${parentKey}[${index}]` : `[${index}]`; keyValuePairFunc(element, currentKey); }); return; } // 处理普通对象(排除null) if (typeof item === "object" && item !== null) { Object.entries(item).forEach(([key, value]) => { const currentKey = parentKey ? `${parentKey}.${key}` : key; keyValuePairFunc(value, currentKey); }); return; } // 基础情况:非对象/数组,直接打印完整键路径和对应值 console.log(`${parentKey}: ${item}`); } // 调用示例 keyValuePairFunc(loadedData);
这个函数的优势:
- 自动处理任意层级的嵌套(不管是6层还是更深)
- 区分对象和数组,数组会用
[索引]的形式展示键路径,比如users[0].profile.name,清晰体现值在嵌套结构中的位置 - 用
parentKey参数拼接完整键路径,避免你搞不清当前值属于哪个层级 - 排除了
null的干扰,避免不必要的错误遍历
为什么你的原函数失效?
你的原函数只手动遍历了两层结构,遇到更深的嵌套就停止了;而且当value是数组时,你用Object.entries遍历会拿到索引和元素,但没有继续递归,所以数组里的嵌套结构不会被展开。
举个测试小例子:
const testData = { level1: "foo", level2: { level3: "bar", level4: [ { level5: "baz", level6: { level7: "qux" } }, "hello" ] } }; keyValuePairFunc(testData);
输出结果会是:
level1: foo level2.level3: bar level2.level4[0].level5: baz level2.level4[0].level6.level7: qux level2.level4[1]: hello
直接把这个函数用到你的loadedData上就能正常遍历所有层级的键值对了。
内容的提问来源于stack exchange,提问作者tsungjen
相关产品推荐
相关产品推荐

