You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用reduce/flatMap将嵌套Swift字典展平为单层字典(无循环)

展平嵌套字典为单一字典(无显式循环)

嘿,你已经用flatMap把外层字典的所有子字典提取成数组了,接下来只需要用reduce配合字典的merging方法,就能把这个字典数组合并成一个单一的字典啦!

完整代码示例

首先定义你的源字典:

let source: [String: [String: String]] = ["Cat": ["A": "1", "B": "2"], "Mat": ["C": "3", "D": "4"]]

分步实现(保留你的中间步骤)

先通过flatMap得到子字典数组:

let flatten = source.flatMap { $0.value } // 结果是 [["A": "1", "B": "2"], ["C": "3", "D": "4"]]

再用reduce合并数组里的所有字典:

let finalResult = flatten.reduce([:]) { accumulatedDict, currentDict in
    // merging方法合并两个字典,闭包处理键冲突(这里保留原有值)
    accumulatedDict.merging(currentDict) { existingValue, _ in existingValue }
}

简化成一行代码

如果你不需要中间变量,可以把两步合并:

let finalResult = source.flatMap { $0.value }.reduce([:]) { $0.merging($1) { $0 } }

关键说明

  • reduce是函数式编程里的聚合方法,它从初始值(这里是空字典[:])开始,逐个处理数组里的元素,把结果累积到累加器中,完全没有显式循环,符合你的要求。
  • merging(_:uniquingKeysWith:)方法会把两个字典合并,第二个闭包用来处理键冲突的情况:
    • 如果两个字典有相同的键,{ existingValue, _ in existingValue }表示保留累加器里已有的值;
    • 如果你想保留新字典里的值,可以改成{ _, newValue in newValue }。

内容的提问来源于stack exchange,提问作者harsh_v

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:40:16