JavaScript如何获取嵌套字典中指向特定值的键路径映射
问题根源
原代码运行不符合预期,核心是三个逻辑错误:
- 全局共享
temp数组,递归遍历不同分支时,数组内容会互相污染,且每次循环末尾直接将temp重置为空数组,导致路径拼接断裂 - 递归进入子对象遍历完成后,没有做路径回溯,上层分支的路径残留会混入下层分支的结果
- 用
.constructor判断类型兼容性差,判断数组优先用JS原生提供的Array.isArray()方法,更稳定可靠。
可直接运行的修正代码
不需要依赖全局变量,递归时传递当前路径的副本,完全避免分支间的路径污染,输出和你要求的格式完全匹配:
function getArrayPaths(dictionary) { const resultList = [] function traverse(currentNode, currentPath) { for (const [key, value] of Object.entries(currentNode)) { const nextPath = [...currentPath, key] if (Array.isArray(value)) { // 命中数组类型,拼接最终值存入结果 resultList.push([...nextPath, value]) } else if (value?.constructor === Object) { // 是对象就递归进入下一层遍历 traverse(value, nextPath) } } } traverse(dictionary, []) return resultList } // 调用方法 const return_list = getArrayPaths(example)
优化输出格式建议
你当前设计的输出把路径键和最终数组值混在同一个数组中,后续提取信息时需要额外判断最后一位的类型,使用起来不够方便。推荐改成结构化对象格式,路径和值分离,后续读取、遍历都更高效:
// 优化后格式示例 [ { path: ["parent4", "sub_2", "sub_sub2", "sub_sub_sub2"], value: ["some list 1"] }, { path: ["parent4", "sub_2", "sub_sub2", "sub_sub_sub2_1"], value: ["some list 2"] }, { path: ["parent4", "sub_3", "sub_sub3"], value: ["some list 3"] }, { path: ["parent4", "sub_4"], value: ["some list 4"] } ]
如果要输出这种格式,只需要把代码中存入结果的逻辑替换为resultList.push({ path: nextPath, value })即可。
内容的提问来源于stack exchange,提问作者yousef
相关产品推荐
相关产品推荐

