flat用于按指定深度降维嵌套数组,默认展一层,传infinity可彻底扁平;flatmap先映射再固定展一层,适合转换+合并场景,二者均返回新数组且不修改原数组。

flat 和 flatMap 是 ES2019 引入的两个实用数组方法,专门用于处理嵌套数组。它们的核心作用是“降维”——把多层嵌套结构变成更扁平的一维(或指定深度)数组。
flat:按指定深度展开嵌套数组
flat() 默认只展开一层,但支持传入一个数字参数控制展开深度。遇到空位(如稀疏数组中的 empty slot)会自动跳过,不产生 undefined。
- arr.flat():等价于 arr.flat(1),只展一层
- arr.flat(2):展两层,适合二维、三维混合结构
- arr.flat(Infinity):彻底展平,不管嵌套多少层
- 对非数组元素(如字符串、数字、null)不做处理,原样保留
示例:
const arr = [1, [2, 3], [4, [5, 6]], 7]; console.log(arr.flat()); // [1, 2, 3, 4, [5, 6], 7] console.log(arr.flat(2)); // [1, 2, 3, 4, 5, 6, 7] console.log(arr.flat(Infinity)); // [1, 2, 3, 4, 5, 6, 7]
flatMap:先映射再展平一层
flatMap() 是 map() + flat(1) 的组合。它先对每个元素执行回调函数(返回任意值),再将所有结果拼成一个数组,并自动展平一层。
- 回调函数返回数组 → 该数组内容被拆开并入最终结果
- 返回非数组值(如字符串、数字)→ 直接作为单个元素加入结果
- 不能指定展开深度,固定只展一层
示例:
const words = ["hello", "world"];
words.map(word => word.split(''));
// [['h','e','l','l','o'], ['w','o','r','l','d']]
<p>words.flatMap(word => word.split(''));
// ['h','e','l','l','o','w','o','r','l','d']</p><p>// 过滤 + 展平结合(返回空数组即跳过)
[1, 2, 3].flatMap(n => n % 2 === 0 ? [n * 2] : []);
// [4]</p>
flat 和 flatMap 的实际使用注意点
- 两者都不修改原数组,返回新数组
- 遇到
null或undefined元素,不会报错,照常处理 - 如果 map 回调中返回 Promise 或对象,flatMap 不会等待或解构,只是原样放入再展平一层
- 想展平对象属性里的数组?需先用 map 提取,再 flat;flatMap 本身不负责提取字段
替代方案与兼容性提醒
旧环境(如 IE、低版本 Node.js)不支持这两个方法。可用以下方式兼容:
- flat(Infinity) 可用递归函数或 JSON.stringify + 正则 + JSON.parse(仅限纯数据)模拟
- flatMap 可写成 arr.map(...).flat(1)(前提是已支持 flat)或手动 reduce + concat
- 现代项目推荐配合 Babel 或直接启用 ES2019+ 目标版本
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











