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

JS递归遍历JSON生成属性路径时报调用栈溢出怎么解决

问题原因
  • 所有数组遍历逻辑错误引用全局data变量,而非当前传入的payload参数,导致每次处理数组时都重复遍历最外层原始数据,触发无限递归造成栈溢出。
  • 处理对象属性时未覆盖嵌套对象的递归逻辑,仅处理了数组和基础类型场景,导致team、match_game这类嵌套对象的子属性无法生成路径。
  • 初始调用传入的前缀为bets,不符合预期输出的data前缀要求。
修复后实现代码
const data = [
  {
    user_id: 356793,
    bets: [
      {
        key: 'total',
        team: {
          away: 1959,
          home: 1418
        },
        value: 1.76,
        match_game: {
          score: {
            away: 17,
            home: 18
          }
        }
      }
    ]
  }
]

const isArray = val => Array.isArray(val)
const isObject = val => !isArray(val) && typeof val === 'object' && val !== null

const toPaths = (payload, prefix) => {
  // 处理数组类型
  if (isArray(payload)) {
    for (let i = 0; i < payload.length; i++) {
      const newPrefix = `${prefix}[i]`
      const currItem = payload[i]
      // 数组项为对象/数组时先打印当前路径,再递归
      if (isArray(currItem) || isObject(currItem)) {
        console.log(newPrefix)
      }
      toPaths(currItem, newPrefix)
    }
    return
  }

  // 处理对象类型
  if (isObject(payload)) {
    for (const key in payload) {
      const currVal = payload[key]
      const newPrefix = `${prefix}.${key}`
      // 所有属性都先打印当前路径
      console.log(newPrefix)
      // 可遍历类型继续递归
      if (isArray(currVal) || isObject(currVal)) {
        toPaths(currVal, newPrefix)
      }
    }
  }
}

// 初始调用,根前缀为data
toPaths(data, 'data')
输出结果
data[i].user_id
data[i].bets
data[i].bets[i]
data[i].bets[i].key
data[i].bets[i].team
data[i].bets[i].team.away
data[i].bets[i].team.home
data[i].bets[i].value
data[i].bets[i].match_game
data[i].bets[i].match_game.score
data[i].bets[i].match_game.score.away
data[i].bets[i].match_game.score.home

内容的提问来源于stack exchange,提问作者Karma Blackshaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:48:01