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
相关产品推荐
相关产品推荐

