【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

Flutter 组件 google_generative_language_api 适配鸿蒙 HarmonyOS 实战:生成式 AI 集成,构建大语言模型调度与全场景智能推理治理架构

Flutter 组件 google_generative_language_api 适配鸿蒙 HarmonyOS 实战:生成式 AI 集成,构建大语言模型调度与全场景智能推理治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 google_generative_language_api 适配鸿蒙 HarmonyOS 实战:生成式 AI 集成,构建大语言模型调度与全场景智能推理治理架构 前言 在鸿蒙(OpenHarmony)生态迈向全场景 AI 赋能、涉及高效的语义理解、自动化内容生成及严苛的端云协同智能隐私保护背景下,如何实现一套既能深度对接 Google 生成式语言模型(如 Gemini、PaLM)、又能保障异步请求高响应性且具备多模态输入处理能力的“AI 调度中枢”,已成为决定应用智能化水平与用户体验代差的关键。在鸿蒙设备这类强调分布式协同与端侧算力按需分配的环境下,如果应用依然采用低效的 REST 手写拼接,由于由于 payload 结构复杂性,极易由于由于“协议解析异常”导致鸿蒙应用在大模型推理环节发生由于由于由于由于通讯阻塞。 我们需要一种能够统一模型调用语义、支持流式(Streaming)响应且符合鸿蒙异步异步并发范式的

By Ne0inhk
从0到1打造专业职配助手:基于openJiuwen记忆库新特性的AI职业规划实战

从0到1打造专业职配助手:基于openJiuwen记忆库新特性的AI职业规划实战

前言 最近基于openJiuwen框架,用它最新推出的独立记忆库功能,搭建了一个“专业职配助手”智能体。它不仅能依托行业知识库给出专业-岗位匹配建议,更能通过记忆库记住用户的专业背景、职业偏好,实现跨智能体的个性化推荐。今天就把从模型配置到智能体测试的全流程拆解给你,重点聊聊记忆库如何让AI真正“懂你”。 一、核心思路:知识库+记忆库,让AI从“会回答”到“懂你” 这次搭建的核心,是openJiuwen的记忆库新特性: * 知识库:作为“公共知识底座”,存储全行业职业数据、专业与岗位对应表,解决“专业能做什么”的问题; * 记忆库:作为“用户专属档案”,存储用户的专业背景、职业偏好、咨询历史,解决“你适合做什么”的问题; * 大模型:负责理解用户需求,同时调用知识库和记忆库,生成精准、个性化的职业建议。 一句话概括:用知识库提供行业广度,用记忆库赋予用户温度,让这两者的结合更高效、更灵活。

By Ne0inhk

旧电脑秒变 AI 员工:OpenClaw 本地部署教程(含环境配置 + 插件开发 + 常见坑)

前言 本文基于最新OpenClaw版本编写,适配电脑低配置场景(最低2vCPU+2GiB内存+40GiB SSD),兼容Windows 10/11(优先WSL2)、Ubuntu 20.04+系统,全程纯操作指令,覆盖环境配置、本地部署、插件开发、高频坑排查。核心解决部署卡顿、国内网络适配、插件开发无思路、报错无法排查四大痛点,全程适配国内网络(国内镜像源)、国内大模型(通义千问、阿里云百炼等),无需海外代理,可稳定运行实现自动化办公(文件处理、IM对接、任务调度等)。 一、前置准备(适配优化) 1.1 硬件要求(最低适配) * CPU:Intel i3 4代+/AMD Ryzen 3 2000+(支持虚拟化,

By Ne0inhk
医疗AI场景下算法编程的深度解析(2026新生培训讲稿)(总结)

医疗AI场景下算法编程的深度解析(2026新生培训讲稿)(总结)

项目总结与完整Python程序 通过本书的学习,我们从医疗AI的基础知识出发,系统掌握了经典机器学习算法的原理与医疗应用,深入探讨了数据处理、特征工程、模型评估、可解释性、不平衡问题处理、模型融合等进阶技术,并在第16章中以ICU败血症早期预警系统为例,完整演示了从问题定义到模型部署的全流程。现在,我们将所有这些知识整合为一个统一的Python程序,实现败血症预测的端到端流程,包括: * 模拟生成符合MIMIC-III分布的数据集 * 数据预处理与特征工程 * 多模型训练(逻辑回归、随机森林、XGBoost) * 模型融合(Stacking) * 超参数调优与不平衡处理 * 模型评估(AUC、PR AUC、分类报告、混淆矩阵) * 可解释性分析(SHAP) * 阈值选择与决策曲线 * 模型保存与简单API示例 该程序可直接运行(需要安装相关库),可作为医疗AI项目的模板。 完整Python程序 # -*- coding: utf-8 -*-

By Ne0inhk