0

0

javascript如何扁平化数组_有哪些方法可以使用【教程】

夜晨

夜晨

发布时间:2026-01-28 16:17:02

|

278人浏览过

|

来源于php中文网

原创

最直接可靠的是Array.prototype.flat(),但默认只扁平一层,需flat(Infinity)彻底展开;兼容老环境或需自定义逻辑时宜用reduce+concat递归实现;扩展运算符配合while仅适用于已知深度;flatMap仅限map后单层扁平。

javascript如何扁平化数组_有哪些方法可以使用【教程】

JavaScript 扁平化数组最直接、最可靠的方式是用 Array.prototype.flat(),但它的行为受参数和环境限制;其他方法(如递归、reduce + concat、扩展运算符)各有适用边界和隐性坑。

flat() 方法:默认只扁平一层,深度需显式指定

flat() 是现代浏览器和 Node.js(≥12)的原生方案,但它默认只处理一层嵌套:

const arr = [1, [2, [3, [4]]]];
arr.flat(); // [1, 2, [3, [4]]] —— 注意:第三层没动

要彻底扁平,得传参 Infinity

arr.flat(Infinity); // [1, 2, 3, 4]
  • 0 相当于不扁平,返回原数组(浅拷贝)
  • 传负数(如 -1)会被转为 0,不是报错
  • IE 完全不支持,需检查运行环境或加 polyfill
  • 会跳过空槽(sparse array 中的 empty slots),比如 [1, , 3].flat()[1, 3]

reduce + concat 实现通用递归扁平(兼容老环境)

当需要支持 IE 或自定义逻辑(比如过滤 null/undefined、跳过某些类型)时,手动递归更可控:

立即学习Java免费学习笔记(深入)”;

PictoGraphic
PictoGraphic

AI驱动的矢量插图库和插图生成平台

下载
const flatten = arr => arr.reduce((acc, val) => 
  Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []
);
  • 注意 concat() 对非数组项会直接追加,对数组会展开一层 —— 所以必须递归调用自身
  • 若原数组含 nullundefined 或原始值(如字符串),Array.isArray(val) 能准确区分
  • 性能比 flat(Infinity) 略差,尤其深层嵌套时函数调用更深
  • 无法处理环状引用(会爆栈),生产环境需加循环检测

扩展运算符 + while 循环:只适合已知最大深度

有人用 [...arr] 配合循环“暴力展开”,但这仅适用于你知道最多几层的情况:

let arr = [1, [2, [3]]];
while (arr.some(Array.isArray)) {
  arr = [].concat(...arr);
}
  • [].concat(...arr) 是关键:扩展运算符把 arr 当作多个参数传给 concat,实现单层展开
  • 每次循环只降一层,some(Array.isArray) 判断是否还有嵌套
  • 如果嵌套太深或结构不规则(如混有对象、类数组),容易出错或无限循环
  • 不能替代 flat(Infinity),因为没有深度上限控制,也难加中间处理逻辑

flatMap() 不是扁平化主力,别误用

flatMap() 的作用是先 mapflat(1),它只扁平**一层**,且前提是 map 返回数组:

[1, 2, 3].flatMap(x => [x, x * 2]); // [1, 2, 2, 4, 3, 6]
  • 它不会递归处理 map 返回的嵌套数组:[1].flatMap(x => [[x]])[[1]],不是 [1]
  • 想靠它多层扁平?得链式调用多次 flatMap(),可读性和效率都差
  • 真正适合场景是“映射后合并结果”,比如拆分字符串、展开 Promise 结果等

真正要注意的是:扁平化不是目的,而是解决数据结构不匹配的手段。如果你的嵌套来自 API 响应或用户输入,优先确认结构是否稳定;用 flat(Infinity) 最省事,但一旦遇到环引用、稀疏数组或需要过滤,就得切到手写递归,并记得加类型判断和边界防护。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

236

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

438

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1501

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

232

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

87

2025.10.17

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

94

2023.09.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.2万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号