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

如何高效递归遍历嵌套对象并处理其中的字符串类型值?

处理未知嵌套结构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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:31:03