如何通过指定键获取UUID动态变化的嵌套JSON对应路径
动态UUID场景下的目标键路径查找实现方案
核心痛点为children节点下的UUID为随机动态值,无法硬编码固定路径,可行方案核心为递归遍历JSON全节点,匹配目标键名时实时拼接当前遍历到的路径段,完全消除对动态键值的硬编码依赖。
实现逻辑
- 从JSON根节点开始逐层级扫描,遇到对象类型时遍历其所有键值对
- 每深入一层就将当前键名追加到临时路径数组中,遇到数组类型则按对应索引记录路径段(格式如
streams[0]) - 匹配到目标键名时,将累积的路径段拼接为标准JSON路径格式直接返回
- 全程不预设动态UUID的具体值,扫描过程中自动将实际遇到的UUID值补入最终路径
可直接运行的实现代码
/** * 递归查找指定键名的JSON完整路径 * @param {any} sourceObj 待遍历的源JSON对象 * @param {string} targetKey 需要定位的目标键名 * @param {array} pathBuffer 递归过程中累积的路径段(内部参数) * @returns {string|null} 匹配到的完整JSON路径,未找到则返回null */ function locateTargetKeyPath(sourceObj, targetKey, pathBuffer = []) { // 非可遍历对象类型直接终止递归 if (typeof sourceObj !== 'object' || sourceObj === null) return null; // 数组节点按索引逐元素遍历 if (Array.isArray(sourceObj)) { for (let idx = 0; idx < sourceObj.length; idx++) { const matchRes = locateTargetKeyPath(sourceObj[idx], targetKey, [...pathBuffer, `[${idx}]`]); if (matchRes) return matchRes; } return null; } // 对象节点按键名逐字段遍历 for (const currentKey in sourceObj) { const updatedPath = [...pathBuffer, currentKey]; // 命中目标键时直接拼接路径返回 if (currentKey === targetKey) { return updatedPath.join('.').replace(/\.\[/g, '['); } // 未命中则递归深入当前键对应的子节点 const matchRes = locateTargetKeyPath(sourceObj[currentKey], targetKey, updatedPath); if (matchRes) return matchRes; } return null; } // 针对示例结构的调用测试 const inventoryPath = locateTargetKeyPath(ourObject, 'myInventory'); // 实际返回路径:payload.streams[0].children.2165d20a-6276-468f-a02f-1abd65cad618.additionalInformation.myInventory
方案优势
- 对动态变化的UUID类键名完全无感知,无论UUID值如何生成,都能自动匹配并生成对应路径
- 支持任意深度的嵌套对象、数组结构扫描,不会因结构层级变化导致查找失效
- 返回的标准路径可直接配合
lodash.get、原生JSON取值逻辑读取对应节点值,无需二次加工
内容的提问来源于stack exchange,提问作者Big Mike
相关产品推荐
相关产品推荐

