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

多层级数组扁平化函数返回值异常问题求助

问题分析与解决方案

你的问题出在递归调用时没有将返回的扁平化结果合并到当前数组中,而且递归逻辑的方向也存在偏差。咱们一步步拆解清楚:

原代码的核心问题

先看你写的这段代码:

function flatten(arg) { 
  const d = []; 
  if (!Array.isArray(arg)) { 
    d.push(arg); 
  } else { 
    // 这里只调用了递归,但完全没把结果存到当前的d里!
    flatten(arg.reduce((a, b) => a.concat(b))); 
  } 
  return d; 
}

每次递归调用flatten时,都会新建一个独立的空d数组。当处理最内层的[1]时,递归进去确实会生成d = [1]并返回,但这个返回值没有被上层函数接住并合并到它自己的d中。上层的d始终是空的,最后最外层返回的自然就是空数组了。

另外,你用arg.reduce((a,b)=>a.concat(b))提前把数组扁平化一层的操作完全没必要——递归的核心应该是逐个处理每个元素,而不是先手动扁平化一层再递归。

修正后的代码

方案1:遍历+递归合并(和你原结构最接近)

这是最直观的写法,完美贴合你最初的代码框架:

function flatten(arg) {
  const d = [];
  if (!Array.isArray(arg)) {
    d.push(arg);
  } else {
    // 遍历数组每个元素,递归扁平化后把结果展开加到当前d里
    for (const item of arg) {
      d.push(...flatten(item));
    }
  }
  return d;
}

console.log(flatten([ [[1]] ])); // 输出:[1]

这里的关键是push(...flatten(item))——把递归返回的扁平化数组展开后添加到当前的d中,确保每一层的结果都能向上合并,最终传递到最外层。

方案2:用reduce简化写法

如果你喜欢更紧凑的风格,可以用reduce替代手动遍历:

function flatten(arg) {
  // 是数组就递归合并每个元素的结果,不是就返回包含当前元素的数组
  return Array.isArray(arg) 
    ? arg.reduce((acc, item) => acc.concat(flatten(item)), []) 
    : [arg];
}

console.log(flatten([ [[1]] ])); // 输出:[1]

这个写法把逻辑压缩到了三行,核心思路和方案1完全一致:递归处理每个元素,将结果累加到初始为空的数组里。

调试现象的解释

你说调试到最后一步时,函数本应返回d=[1],但执行return d后回到起始位置值全变了——这是因为递归的每一层都有自己独立的d变量。最内层的d确实是[1],但它只属于那一层递归函数,上层函数的d还是空的。当内层递归返回后,上层函数并没有把这个值合并进去,所以最后返回的是最外层的空d。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:33:07