如何生成带数组索引的完整JPath?深层数组适配问题
解决深层数组的JPath完整路径生成问题
问题说明
需要实现一个JavaScript函数,根据输入的JPath片段(如LEVEL1OBJ.LEVEL2ARR.LEVEL3OBJ)和目标JSON对象,生成包含数组索引的完整JPath。现有代码仅支持一级数组场景,无法处理二级及以上的深层数组,递归改写后结果不符合预期。
修正后的递归实现
核心思路是递归拆解JPath片段的每一层,判断当前节点是否为数组,若是则自动添加索引(这里默认取第一个元素的索引[0],可根据需求调整为遍历所有索引),逐步拼接完整路径:
function generateFullJPath(obj, pathFragment) { const pathParts = pathFragment.split('.'); let currentObj = obj; let fullPath = ''; function traverse(index) { if (index >= pathParts.length) return; const key = pathParts[index]; // 处理当前层级的路径拼接 if (Array.isArray(currentObj)) { // 当前是数组,取第一个元素的索引(可修改为遍历所有索引) fullPath += `[0]`; currentObj = currentObj[0]; } else { fullPath += fullPath ? `.${key}` : key; currentObj = currentObj[key]; } // 递归处理下一层 traverse(index + 1); // 处理最后一层是数组的情况 if (index === pathParts.length - 1 && Array.isArray(currentObj)) { fullPath += `[0]`; } } traverse(0); return fullPath; }
代码逻辑说明
- 将输入的JPath片段按
.拆分为路径数组 - 递归遍历每一层路径:
- 若当前节点是数组,拼接索引并切换到数组的第一个元素
- 若当前节点是对象,直接拼接键名并切换到对应属性
- 最后一层如果是数组,补充索引
测试示例
目标JSON对象
const targetObj = { LEVEL1OBJ: { LEVEL2ARR: [ { LEVEL3OBJ: "test value" } ] } };
输入JPath片段
LEVEL1OBJ.LEVEL2ARR.LEVEL3OBJ
错误输出(原代码)
LEVEL1OBJ.LEVEL2ARR.LEVEL3OBJ(未添加数组索引)
预期输出
LEVEL1OBJ.LEVEL2ARR[0].LEVEL3OBJ
修正后代码输出
调用generateFullJPath(targetObj, 'LEVEL1OBJ.LEVEL2ARR.LEVEL3OBJ'),返回LEVEL1OBJ.LEVEL2ARR[0].LEVEL3OBJ,符合预期。
扩展说明
如果需要支持遍历数组所有元素生成多条完整JPath,可修改递归逻辑,在遇到数组时遍历每个索引并生成对应路径,返回路径数组。
内容的提问来源于stack exchange,提问作者Ankit Srivastava
相关产品推荐
相关产品推荐

