Swift:用map/reduce/flatMap将值为数组的字典合并为同类型单数组
Swift 字典值数组合并为一维数组的函数式实现
核心需求
将字典m中所有存储的字符串子数组合并为单一一维数组,替代手写循环append的冗长写法。
可选实现方案
最简洁的一行实现
let result = m.values.flatMap { $0 }
逻辑拆解:
- 直接调用字典的
values属性,获取所有值组成的二维序列 flatMap会遍历序列中每个子数组,自动将所有子数组的元素展平拼接为一维数组,无多余的临时数组创建,执行效率和手写循环一致
基于reduce的函数式写法
贴合函数式方法思路,高效实现代码:
let result = m.values.reduce(into: [String]()) { $0.append(contentsOf: $1) }
逻辑拆解:
- 以空
[String]数组作为初始累加器 - 遍历values中的每个子数组,直接将整个子数组的内容追加到累加器中,全程只有一个最终的目标数组,没有中间临时数组的内存开销
基于map + joined的实现
如果需要使用map方法,可以搭配序列的joined()完成展平:
let result = Array(m.map(\.value).joined())
注意:这种写法效率略低于flatMap和reduce版本,因为map阶段会先完整生成一个二维数组,再做连接操作。
补充说明
字典本身是无序存储结构,所有遍历方式得到的最终元素顺序,和手写for-in遍历字典的顺序完全一致,不会固定按照key的字典序排列。
内容的提问来源于stack exchange,提问作者xceph
相关产品推荐
相关产品推荐

