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

如何在函数内部创建数组实现嵌套数组的递归展开?

如何在递归函数内部实现嵌套数组展开

当然可以!完全不需要依赖外部数组来存储展开结果,我们可以让递归函数自己管理内部的数组,通过递归调用的返回值来逐层拼接最终结果。先看看你现有代码的几个小问题:

  • 依赖外部的newArray会导致函数不是纯函数,多次调用时会保留之前的结果;
  • arr.forEach(...)的返回值是undefined,所以arr = arr.forEach(...)这行代码其实没有意义。

下面是两种在函数内部创建数组的实现方式:

方法一:forEach + 内部数组拼接

var test = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68];

function nestedArray(arr) {
  // 每次调用函数时,内部创建一个新的空数组用于存储当前层级的展开结果
  let result = [];
  
  arr.forEach(item => {
    if (Array.isArray(item)) {
      // 如果当前元素是数组,递归展开它,并用扩展运算符把结果合并到当前result中
      result.push(...nestedArray(item));
    } else {
      // 非数组元素直接加入结果
      result.push(item);
    }
  });
  
  return result;
}

// 调用测试
console.log(nestedArray(test));

方法二:用reduce简化逻辑

reduce非常适合这种需要累积结果的场景,我们可以用它来直接构建展开后的数组:

var test = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68];

function nestedArray(arr) {
  // 初始值是空数组(也就是内部的存储容器),通过reduce迭代累积结果
  return arr.reduce((accumulator, currentItem) => {
    // 如果当前元素是数组,递归展开后合并到累加器;否则直接合并当前元素
    return accumulator.concat(Array.isArray(currentItem) ? nestedArray(currentItem) : currentItem);
  }, []);
}

// 调用测试
console.log(nestedArray(test));

这两种实现都是纯函数,不依赖任何外部变量,每次调用都会返回全新的展开数组,逻辑清晰且复用性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:06:44