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

递归函数无法保存临时结果:提取嵌套对象双分支字符串值

递归收集嵌套对象分支字符串的解决方案

先看你的代码为啥返回空数组,核心问题有这几个:

  1. 没区分main和offhand分支,递归时不知道该把字符串往哪个数组塞,而且只处理了直接是字符串的属性,嵌套对象里的字符串根本没遍历到;
  2. 每次进入对象判断就新建一个空的data,上层递归的结果全被覆盖了,最后自然留不下东西;
  3. 遍历逻辑不全,遇到属性值是对象的时候直接跳过了,深层的字符串根本没机会被收集。

给你改好的代码,直接能用:

const obj = 
  { main: 
    { value: { value: 'main value'}
    , anotherValue : 'some another value'
    }
  , offhand: 
    { value: 
      { value: 'offhand value'
      , anotherValue: 'again recursion'
      }
    }
  }

function devider(object) {
  // 先建好最终要返回的结果容器
  const result = {
    fromMainHand: [],
    fromOffHand: []
  };

  // 写个内部递归函数,专门负责收集字符串到指定数组
  function collect(currentObj, targetArr) {
    for (const key in currentObj) {
      const value = currentObj[key];
      if (typeof value === 'string') {
        // 是字符串直接塞目标数组
        targetArr.push(value);
      } else if (typeof value === 'object' && value !== null) {
        // 是对象就继续递归遍历它的属性
        collect(value, targetArr);
      }
    }
  }

  // 分别处理main和offhand两个分支,把对应分支的字符串收集到各自数组
  collect(object.main, result.fromMainHand);
  collect(object.offhand, result.fromOffHand);

  return result;
}

console.log(devider(obj));

运行后输出就是你要的:

{ fromMainHand: ['main value', 'some another value'], fromOffHand: ['offhand value', 'again recursion'] }

说下改了啥:

  • 把递归收集的逻辑拆成内部函数collect,每次传要处理的对象和目标数组,明确知道字符串该往哪放;
  • 不管属性是字符串还是嵌套对象都处理,深层的字符串也能被挖到;
  • 结果容器在最外层只建一次,所有递归都往同一个容器里塞数据,不会丢失。

内容的提问来源于stack exchange,提问作者quester

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:00:22