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

JavaScript递归函数中Array.forEach无法识别传入参数导致undefined问题排查与解决

问题分析与解决方案:递归函数中newObj参数变为undefined的原因

你遇到的问题其实非常典型——在递归调用时遗漏了必要的参数传递!

先看你第一个版本的代码:

const iterate = (obj, newObj) => {
  Object.keys(obj).forEach(key => {
    if (typeof obj[key] === 'object') {
      // 这里只传了第一个参数obj[key],没传newObj!
      iterate(obj[key])
    } else{
      delete obj[key];
      Object.assign(obj, newObj);
    }
  })
}

当你进入typeof obj[key] === 'object'的分支时,调用iterate只传入了第一个参数obj[key],完全没把newObj传下去。这就导致在这个递归层级里,newObj参数默认是undefined,等后续走到else分支要使用newObj的时候,自然就找不到正确的值了。

而第二个能正常运行的代码,本质是因为它不需要依赖外部传入的newObj,而是在else分支里自己定义了newObj,所以不存在参数传递遗漏的问题。

修正方案

只需要在递归调用时把newObj参数也传过去就行:

const iterate = (obj, newObj) => {
  Object.keys(obj).forEach(key => {
    if (typeof obj[key] === 'object') {
      // 补上newObj参数
      iterate(obj[key], newObj)
    } else{
      delete obj[key];
      Object.assign(obj, newObj);
    }
  })
}

这样每个递归层级都能拿到正确的newObj参数,forEach内部自然就能识别到它了。

额外注意

另外提个小细节:typeof []也会返回'object',如果你的数据里包含数组,当前逻辑会把数组当成普通对象处理(用Object.keys遍历索引),如果这不符合你的预期,可能需要额外加个判断Array.isArray(obj[key])来区分处理,但这属于需求延伸的问题,核心的参数传递问题已经解决啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:12:30