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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:36:25