【JavaScript】不用flat怎么扁平化数组

你想在不使用数组的flat()方法的前提下实现数组扁平化,核心是通过递归或迭代的方式,逐层遍历数组中的元素,把嵌套的子数组 “拆解” 成一维数组。我会给你几种实用且易懂的实现方式,覆盖不同场景需求。

方法 1:递归实现(最易理解,适合新手)

递归的核心思路是:遍历数组的每一个元素,如果元素是数组,就继续递归处理这个子数组;如果不是数组,就直接加入结果数组。

// 递归实现数组扁平化(可指定扁平化深度,默认完全扁平化) function flattenArray(arr, depth = Infinity) { // 存储最终扁平化结果 const result = []; // 遍历原数组的每一个元素 arr.forEach(item => { // 判断:如果当前元素是数组,且还没达到指定扁平化深度 if (Array.isArray(item) && depth > 0) { // 递归处理子数组,深度减1 result.push(...flattenArray(item, depth - 1)); } else { // 非数组元素直接加入结果 result.push(item); } }); return result; } // 测试用例 const nestedArr = [1, [2, [3, [4, 5]], 6], 7]; // 完全扁平化 console.log(flattenArray(nestedArr)); // [1, 2, 3, 4, 5, 6, 7] // 只扁平化1层 console.log(flattenArray(nestedArr, 1)); // [1, 2, [3, [4, 5]], 6, 7]

关键解释

  • Array.isArray(item):判断元素是否为数组,这是扁平化的核心判断条件;
  • depth 参数:控制扁平化深度,和flat(depth)的参数逻辑一致,默认Infinity表示完全扁平化;
  • 扩展运算符...:把递归返回的子数组元素逐个推入结果数组,避免嵌套。

方法 2:迭代实现(循环 + 栈,避免递归栈溢出)

如果数组嵌套层级极深(比如几十层),递归可能会触发栈溢出错误,这时用迭代(循环)+ 栈的方式更稳健。

// 迭代实现数组扁平化(完全扁平化) function flattenArrayIterative(arr) { // 用栈存储待处理的元素,先把原数组浅拷贝入栈 const stack = [...arr]; const result = []; // 只要栈不为空,就继续处理 while (stack.length) { // 弹出栈顶元素 const item = stack.pop(); if (Array.isArray(item)) { // 如果是数组,把元素重新推入栈(注意顺序:pop是从末尾取,所以要反向推入保持原顺序) stack.push(...item); } else { // 非数组元素加入结果 result.push(item); } } // 因为pop是从后往前取,结果需要反转恢复原顺序 return result.reverse(); } // 测试用例 const nestedArr = [1, [2, [3, 4], 5]]; console.log(flattenArrayIterative(nestedArr)); // [1, 2, 3, 4, 5]

关键解释

  • 栈(stack)的特性是 “后进先出”,所以最后需要reverse()恢复原数组顺序;
  • 迭代方式没有递归的栈深度限制,适合处理超深嵌套的数组。

方法 3:利用 reduce 简化递归(简洁写法)

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); } }, []); // 初始值为空数组 } // 测试用例 const nestedArr = [1, [2, [3]], 4]; console.log(flattenArrayReduce(nestedArr)); // [1, 2, 3, 4]

关键解释

  • reduceacc(累计值)就是最终的扁平化数组;
  • concat 方法可以把数组或单个元素合并到数组中,替代push(...)更简洁。

总结

不用flat()实现数组扁平化的核心要点:

  1. 核心逻辑:遍历数组元素,判断是否为数组,是则拆解层级,否则直接保留;
  2. 实现方式
    • 递归(forEach/reduce):代码易读,适合常规嵌套深度的数组;
    • 迭代(栈):无栈溢出风险,适合超深嵌套的数组;
  3. 扩展点:通过depth参数可模拟flat(depth)的 “指定深度扁平化” 功能,适配不同需求。

这些方法都能兼容所有主流浏览器,且逻辑清晰,新手可以先从递归法入手理解,再根据实际场景选择迭代法或 reduce 写法。

Read more

FPGA实现HDMI输出完全攻略:从接口原理到4K显示全流程(附代码模板+调试技巧)

FPGA实现HDMI输出完全攻略:从接口原理到4K显示全流程(附代码模板+调试技巧) 📚 目录导航 文章目录 * FPGA实现HDMI输出完全攻略:从接口原理到4K显示全流程(附代码模板+调试技巧) * 📚 目录导航 * 概述 * 一、HDMI基础概念 * 1.1 HDMI接口介绍 * 1.1.1 HDMI接口历史与发展 * 1.1.2 HDMI接口引脚定义 * 1.1.3 HDMI版本对比 * 1.2 HDMI版本演进 * 1.2.1 HDMI 1.4特性 * 1.2.2 HDMI 2.0特性 * 1.2.3 HDMI 2.1特性

By Ne0inhk
Nano Banana进行AI绘画中文总是糊?一招可重新渲染,清晰到可直接汇报

Nano Banana进行AI绘画中文总是糊?一招可重新渲染,清晰到可直接汇报

文章目录 * 1. 为什么 Nano Banana 生成的中文经常不清晰? * 2. 解决思路:Nano Banana + Seedream 4.5 的两段式工作流 * 3. 实战:先用 Nano Banana 生成架构图(中文会糊) * 4. 部署 Personal LLM API,并配置 Seedream 4.5 * 5. 用 Cherry Studio 配置已部署的 LLM 接口 * 6. 关键一步:用 Seedream 4.5 对“中文文字重新渲染” * 7. 效果对比:字清晰、无错位、图形保持不变

By Ne0inhk

5分钟部署麦橘超然Flux,低显存设备也能玩转AI绘画

5分钟部署麦橘超然Flux,低显存设备也能玩转AI绘画 1. 为什么你值得花5分钟试试这个Flux控制台 你是不是也遇到过这些情况: * 想试试最新的Flux模型,但显卡只有8GB甚至6GB,一加载就报“CUDA out of memory”; * 下载完模型还要手动配置路径、改代码、调参数,折腾两小时还没看到一张图; * 网页版用着方便,但担心隐私泄露、生成被限速、图片被缓存; 别再纠结了——麦橘超然 - Flux 离线图像生成控制台,就是为这类真实场景而生的。它不是又一个需要编译、调参、查文档的实验项目,而是一个开箱即用的本地Web服务:模型已打包进镜像,float8量化技术让DiT主干网络显存占用直降近一半,Gradio界面简洁到连提示词输入框都标好了占位符,连SSH隧道怎么转发都给你写好了命令。 更重要的是,它真的能在你的旧笔记本、远程小内存服务器、甚至实验室里那台只配了RTX 3060的工位机上跑起来。本文不讲原理推导,不堆术语,就带你从零开始,5分钟内完成部署、打开浏览器、输入第一句描述、亲眼看到AI画出赛博朋克雨夜街道——所有操作一步接一步,复制粘贴就能

By Ne0inhk

简单易学的分离式部署小米智能家居Miloco方法

一、安装环境 * Windows用户:安装WSL2以及Docker * macOS/Linux用户:安装Docker 此处不再赘述,网上随便找个教程即可。特别地,对于Windows用户来说,你需要将 WSL2 的网络模式设置为 Mirrored。 二、使用Docker部署Miloco后端 以下均为bash命令。请Windows用户进入WSL2 / Linux、macOS用户进入终端操作: mkdir miloco cd milico vi docker-compose.yml 以下是compose的内容(不会使用vi的同学可以傻瓜式操作:先按i,再使用粘贴功能,然后按冒号,输入wq然后回车,记得关闭输入法): services:backend:container_name: miloco-backend image: ghcr.nju.edu.cn/xiaomi/miloco-backend:latest network_mode:

By Ne0inhk