跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端算法

不使用 flat 方法实现 JavaScript 数组扁平化的三种方案

数组扁平化是常见需求,当无法使用内置 flat 方法时,可通过递归、迭代栈或 reduce 函数手动实现。递归法逻辑直观但深嵌套可能溢出,迭代法更稳健,reduce 写法简洁。通过控制深度参数可模拟 flat 行为,适配不同场景。

GRACE Grace发布于 2026/3/23更新于 2026/8/2232 浏览

很多时候我们需要处理嵌套数组,但环境不支持 flat() 或者想更精细地控制过程。核心思路其实就两点:遍历元素,遇到数组就继续拆解,否则保留。下面分享三种落地方案,从易到难,覆盖不同场景。

递归实现(最直观,适合常规场景)

递归的核心在于'自调用'。遍历数组的每一个元素,如果当前项是数组且未达到指定深度,就再次调用自身;如果不是数组,直接加入结果。这种方式代码可读性最高,新手最容易上手。

function flattenArray(arr, depth = Infinity) {
  const result = [];
  arr.forEach(item => {
    if (Array.isArray(item) && depth > 0) {
      result.push(...flattenArray(item, depth - 1));
    } else {
      result.push(item);
    }
  });
  return result;
}

// 测试:完全扁平化
console.log(flattenArray([1, [2, [3]], 4])); 
// 输出:[1, 2, 3, 4]

这里有个细节要注意:depth 参数控制了扁平化的层级,默认 Infinity 表示彻底打平。配合扩展运算符 ...,可以把递归返回的子数组元素逐个展开,避免二次嵌套。

迭代实现(防栈溢出,适合深层嵌套)

如果数组嵌套极深,递归可能会触发调用栈溢出错误。这时候用循环加栈的方式更稳妥。利用栈'后进先出'的特性,把待处理的子数组压入栈中,直到栈空为止。

function flattenArrayIterative(arr) {
  const stack = [...arr];
  const result = [];
  
  while (stack.length) {
    const item = stack.pop();
    if (Array.isArray(item)) {
      stack.push(...item);
    } else {
      result.push(item);
    }
  }
  
  return result.reverse();
}

// 测试
console.log(flattenArrayIterative([1, [2, [3, 4], 5]]));
// 输出:[1, 2, 3, 4, 5]

因为 pop 是从末尾取元素,为了保持原数组顺序,最后需要反转一次结果。虽然多了一步操作,但避免了递归深度的限制,处理超深嵌套更安全。

Reduce 简化写法(函数式风格)

喜欢函数式编程的话,可以用 reduce 替代显式的循环和结果数组声明。逻辑和递归法一致,只是写法更紧凑。

function flattenArrayReduce(arr, depth = Infinity) {
  return arr.reduce((acc, item) => {
    if (Array.isArray(item) && depth > 0) {
      return acc.concat(flattenArrayReduce(item, depth - 1));
    } else {
      return acc.concat(item);
    }
  }, []);
}

// 测试
console.log(flattenArrayReduce([1, [2, [3]], 4]));
// 输出:[1, 2, 3, 4]

acc 就是累计的扁平化数组,concat 负责合并。这种写法在代码量上最省,但在性能极端场景下可能不如前两种灵活。

总结

不用 flat() 也能搞定数组扁平化,关键在于理解'拆解'的逻辑。

  • 递归法:代码简单,适合大多数情况。
  • 迭代法:无栈溢出风险,适合深层数据。
  • Reduce 法:简洁优雅,适合函数式偏好者。

实际开发中,可以根据数据嵌套深度和团队编码规范来选择。如果需要精确控制扁平化层数,记得加上 depth 参数,这样就能完美模拟 flat(depth) 的行为。

目录

  1. 递归实现(最直观,适合常规场景)
  2. 迭代实现(防栈溢出,适合深层嵌套)
  3. Reduce 简化写法(函数式风格)
  4. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • FPGA 快速傅里叶变换(FFT)IP 核配置与实现
  • 前端数据库 IndexedDB 详解:构建离线 Web 应用
  • Android 开发从零入门:学习路线与核心知识体系
  • SkyWalking .NET/C++/Lua 探针现状与社区支持
  • MacOS 下基于 Docker 部署 OpenClaw 并集成飞书机器人
  • 大模型技术详解:定义、架构与核心应用场景
  • C++ 类与对象进阶:默认成员函数与操作符重载
  • 使用 Git 将本地项目上传至 GitHub
  • 构建 AI 临床副驾驶:基于 Go 的电子病历智能助手与 HIS 对接实战
  • Web JS 逆向全体系详解
  • Stable Diffusion WebUI 为何被淘汰:ComfyUI 的崛起与 AIGC 工具迭代
  • HTTP 协议基础与 HTTPS 加密原理
  • HarmonyOS PC 与手机双端协同开发实战:UI 适配、窗口管理与性能调优
  • 基于 HTML5+CSS3+JavaScript 的高木同学圣诞树 GalGame 开发
  • MCP、Agent、Skills:AI 时代三大核心概念深度解析
  • Linux 常用指令详解与重定向实战
  • Python 在金融风险管理中的核心应用与实战指南
  • OpenClaw Zero Token 深度解析:浏览器自动化实现大模型免 Token 调用
  • AI 产品经理转型指南:核心能力与学习路径
  • OpenAI 发布 Canvas 交互界面,增强 ChatGPT 写作与编程协作能力

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online