array.prototype.flat(infinity)是最直接、安全、高效的一维展平方法,现代浏览器和node.js原生支持;它只展开数组、保留非数组项、跳过空位、保留null/undefined;旧环境可用递归reduce实现,禁用json或tostring等类型丢失方案。

用 Array.prototype.flat(Infinity) 是最直接、安全、高效的方式。它专为此设计,现代环境(Chrome ≥ 72、Firefox ≥ 62、Safari ≥ 15.4、Node.js ≥ 12)原生支持,无需额外依赖。
flat() 的深度控制很灵活
它接受一个可选参数 depth,决定展开几层:
- 不传参 → 默认只展开第一层:
[1, [2, [3]]].flat()得[1, 2, [3]] - 传数字 → 指定层数:
[1, [2, [3, [4]]]].flat(2)得[1, 2, 3, [4]] - 传
Infinity→ 彻底展平所有嵌套:[1, [2, [3, [4]]]].flat(Infinity)得[1, 2, 3, 4]
注意空位与非数组元素的处理
flat() 只处理数组,其他类型原样保留,且对稀疏结构有明确行为:
- 真·空位(如
Array(3)或delete arr[1])会被跳过:[1, , 3].flat()→[1, 3] -
null、undefined是值,不是空位,会被保留:[1, [null, undefined]].flat()→[1, null, undefined] - 对象、函数、日期等非数组项不会被展开,也不会报错:
[1, {a:2}, [3]].flat()→[1, {a:2}, 3]
旧环境兼容方案:手写递归 + Array.isArray 安全判断
若需支持 IE 或老版本 Node.js,可用 reduce + concat 实现轻量替代:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
function flat(arr, depth = 1) {
if (depth === 0) return arr;
return arr.reduce((acc, item) => {
return acc.concat(Array.isArray(item) ? flat(item, depth - 1) : item);
}, []);
}
关键点:
- 必须用
Array.isArray(item)判断,不能用typeof item === 'object'(会把null、Date等误判) - 递归深度可控,避免无限循环
- 完全展平时调用
flat(arr, Infinity)即可(内部会自然终止)
别碰 JSON 黑魔法和 toString 陷阱
像 JSON.stringify(arr).replace(/[\[\]]/g,'').split(',') 或 arr.toString().split(',') 看似简短,但问题严重:
- 类型丢失:
true→"true",Symbol('a')→ 报错,undefined→"undefined" - 对象变字符串:
{x:1}→"[object Object]" - 性能差:序列化 + 正则 + 解析,比
flat()慢一个数量级以上
这类写法只适合临时调试,不可用于生产代码。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










