javascript数组扁平化最直接的方式是用flat(infinity),它能一次性彻底打平任意嵌套层级;若需兼容旧环境或自定义逻辑,则递归是最清晰可控的替代方案。

JavaScript 数组扁平化最直接的方式是用 flat(Infinity),它能一次性彻底打平任意嵌套层级;若需兼容旧环境或自定义逻辑,则递归是最清晰可控的替代方案。
flat(Infinity):现代标准,一行搞定
这是当前开发中首选方法,语法简洁、性能好、语义明确:
-
完全打平:直接传
Infinity,不管嵌套多少层都展开,例如[1, [2, [3, [4]]]].flat(Infinity)→[1, 2, 3, 4] -
空位自动跳过:稀疏数组如
[1, , 3]经.flat()后变成[1, 3],不保留空槽 -
类型安全:只处理数组,字符串、对象、
null、undefined均原样保留,不会误转或报错 - 注意兼容性:IE 全系不支持,Node.js 需 ≥12,老环境需 polyfill 或换方案
递归实现:兼容性强,逻辑透明
适用于需要支持 IE、或要在扁平过程中插入过滤、类型转换等自定义逻辑的场景:
-
基础递归:遍历每个元素,是数组就递归调用,否则推入结果。关键用
Array.isArray()判断,避免把字符串或对象误当数组展开 -
带深度控制:函数可加
depth参数(默认Infinity),每次递归减 1,到 0 就停止,模拟flat(n)行为 -
避免 concat 嵌套:用
acc.concat(flatten(item))而非acc.push(flatten(item)),确保子数组元素被真正“拆开”而非塞进新数组 - 慎防栈溢出:超深嵌套(如 100 层)可能触发调用栈限制,此时应改用迭代(栈+while)方案
别踩这些坑
有些看似简洁的方法实际隐患明显:
-
toString().split(',') 不可靠:所有值变字符串,
[1, [2, 'a,b']]会因逗号错切;null、对象、函数全丢失 -
JSON.stringify + 正则替换危险:原始数据含方括号或引号时正则失效;
undefined、Symbol、函数序列化后消失 -
扩展运算符 + while 循环仅限二维试探:写成
arr = [].concat(...arr)每次只降一层,但无法控制总深度,结构不规整时易死循环
怎么选?看环境和需求
日常开发优先用 arr.flat(Infinity);项目需支持 IE 或要对 null、空数组做预处理,就手写递归;其他“黑魔法”除非临时调试,否则不建议上线。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











