如何高效递归遍历嵌套对象并处理其中的字符串类型值?
处理未知嵌套结构JSON的字符串值修改方案
递归是处理这类任意深度嵌套JSON结构的最优方案,时间复杂度为O(n)(n为所有层级中键值对/元素的总数)——这是理论最优,因为你必须遍历每个元素至少一次才能完成需求。
正确的递归实现
以下代码覆盖了JSON中常见的嵌套场景(对象、数组),并确保所有字符串值都被处理:
function processJsonResponse(obj) { // 处理数组:遍历每个元素递归处理 if (Array.isArray(obj)) { for (let i = 0; i < obj.length; i++) { obj[i] = processJsonResponse(obj[i]); } return obj; } // 处理对象(排除null,因为typeof null === 'object') if (typeof obj === 'object' && obj !== null) { for (const [key, value] of Object.entries(obj)) { obj[key] = processJsonResponse(value); } return obj; } // 处理字符串:调用somelogic处理后返回 if (typeof obj === 'string') { return somelogic(obj); } // 其他类型(数字、布尔、null)直接返回,不修改 return obj; }
常见遗漏问题的原因
你之前用Object.keys/entries遍历出现遗漏,大概率是这几个原因:
- 未处理数组类型:JSON响应中可能包含数组,数组内的嵌套对象/字符串会被跳过
- 未排除
null:typeof null返回object,如果直接把null当成对象遍历会出错,导致后续逻辑中断 - 未将递归处理后的结果赋值回原对象:只递归遍历但不替换原属性值,等于没修改
可选优化:非原地修改
如果不想修改原JSON对象,可以创建副本处理,避免副作用:
function processJsonResponse(obj) { if (Array.isArray(obj)) { return obj.map(item => processJsonResponse(item)); } if (typeof obj === 'object' && obj !== null) { return Object.fromEntries( Object.entries(obj).map(([key, value]) => [key, processJsonResponse(value)]) ); } if (typeof obj === 'string') { return somelogic(obj); } return obj; }
注意事项
somelogic函数必须返回处理后的字符串,才能正确替换原值- 该实现覆盖了JSON的所有基础类型(对象、数组、字符串、数字、布尔、null),适配绝大多数HTTP返回的JSON结构
内容的提问来源于stack exchange,提问作者I am
相关产品推荐
相关产品推荐

