【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

飞算JavaAI插件深度体验:三天任务半小时搞定,AI编程的革命性突破

飞算JavaAI插件深度体验:三天任务半小时搞定,AI编程的革命性突破

文章目录 * 飞算JavaAI插件深度体验:三天任务半小时搞定,AI编程的革命性突破 * 一、引言:从绝望到惊喜的转变 * 二、飞算JavaAI初体验:对话即开发 * 2.1 插件安装与配置 * 2.2 需求分析:AI理解业务场景 * 2.3 接口设计:从需求到API * 2.4 数据库设计:智能表结构生成 * 2.5 业务逻辑生成:核心功能实现 * 2.6 一键生成源码:项目快速构建 * 三、项目构建完成:效率提升的震撼体验 * 3.1 代码质量评估 * 四、实际运行测试:验证AI生成代码的可用性 * 4.1 接口测试结果 * 五、性能对比:传统开发 VS AI辅助开发

By Ne0inhk
JAVA快速入门到精通牛客零基础刷题指南:35~37 手把手带刷:常用API,日期工具

JAVA快速入门到精通牛客零基础刷题指南:35~37 手把手带刷:常用API,日期工具

常用API 日期工具 Date Date类用来处理日期和时间,但是该类的大部分构造器、方法均以过时。 - 常用的构造方法 // 创建代表当前时间的Date对象,底层调用System类获取当前时间毫秒数。 public Date() { } // 根据指定的时间毫秒数创建Date对象,参数为时间的毫秒数。 public Date(long date) { } - 常用的成员方法 // 判断该时间是否在指定时间之后 public boolean after(Date when) { } // 判断该时间是否在指定时间之前 public boolean before(Date when) { } // 返回该时间的毫秒数 public long getTime() { } // 以毫秒数的形式,设置该Date对象所代表的时间。 public void setTime(long time) { } Calendar * 相比于Date类,Calendar类可以更好地处理日期和时间。 * Calendar是一个抽象类,所以不能通过构造器创建Calendar对象。 *

By Ne0inhk

Java 设计模式・策略模式篇:从思想到代码实现

一、行为型模式 在面向对象的世界里,如何优雅地组织对象间的交互、分配职责,是每一位开发者都会反复思考的问题。直接硬编码交互逻辑固然简单,但当业务复杂度上升、对象协作关系变得错综复杂时,这种方式就会让代码变得僵化、难以扩展。 行为型设计模式正是为了解决这一痛点而诞生的一套思想体系。它们关注如何定义对象之间的通信方式和职责分配,通过命令、迭代、观察者、策略等手段,让对象间的协作更具灵活性、可复用性和可维护性。 在 Java 开发中,行为型模式主要包含以下 11 种经典实现: 1. 模板方法模式 (Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。Java 设计模式・模板方法模式篇:从思想到代码实现-ZEEKLOG博客 2. 策略模式 (Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换,让算法独立于使用它的客户而变化。 3. 命令模式 (Command):将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,支持可撤销操作。J

By Ne0inhk
Java 大视界 -- Java 大数据分布式计算在基因测序数据分析与精准医疗中的应用(400)

Java 大视界 -- Java 大数据分布式计算在基因测序数据分析与精准医疗中的应用(400)

Java 大视界 -- Java 大数据分布式计算在基因测序数据分析与精准医疗中的应用(400) * 引言: * 正文: * 一、传统基因测序分析的 “三重困局”:慢、漏、贵 * 1.1 数据洪流压垮单机算力 * 1.1.1 测序数据量与算力的矛盾 * 1.1.2 数据存储与复用难题 * 1.2 突变检测漏检率高 * 1.2.1 单机分析的 “算力天花板” * 1.2.2 临床解读与数据脱节 * 1.3 成本高企制约普及 * 1.3.1 硬件与人力成本双高 * 1.3.2 基层医院 “用不起” * 二、

By Ne0inhk