flatmap本质是map+flat(1),即先对每个元素执行映射函数返回数组(或自动包装),再压平一层;它不处理深层嵌套,返回值强制转为数组后扁平化,适用于字符串拆分、子列表展开等场景。

flatMap 就是先对每个元素执行映射函数,再把所有返回结果自动“压平一层”,一步到位。
它本质上等于 map() + flat(1)
比如你用 arr.map(x => [x, x * 2]),会得到一个嵌套数组:[[1, 2], [2, 4], [3, 6]];而换成 arr.flatMap(x => [x, x * 2]),直接输出:[1, 2, 2, 4, 3, 6]。中间不创建临时数组,语义更直白,性能也略好。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
必须返回数组,否则会被自动包装
回调函数的返回值会被强制转为数组再扁平化:
- 返回
[1, 2]→ 正常展开为1, 2 - 返回
5→ 被当作[5]处理,最终结果含5 - 返回
null或undefined→ 变成[null]或[undefined],仍参与扁平化
只扁平一层,深层嵌套不受影响
如果映射函数返回的是二维数组,比如 x => [[x]],flatMap 后仍是 [[1], [2], [3]],不会变成 [1, 2, 3]。需要更深扁平化,得额外调用 flat(Infinity) 或递归处理。
常见实用场景
- 拆分字符串:
["a b", "c d e"].flatMap(s => s.split(" "))→["a","b","c","d","e"] - 展开子列表:用户数组中每个用户有
posts数组,提取全部文章users.flatMap(u => u.posts) - 条件映射+合并:只保留非空子项
items.flatMap(item => item.children?.length ? item.children : [])










