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

Swift中如何合并两个非对等字典并生成目标新字典

优化的Swift字典合并方案

核心优化思路

直接基于原始字典数据,一次性完成分组与合并,避免多次转换中间字典带来的性能损耗:

  • 收集所有涉及的日期(合并两个字典的key,确保不遗漏任何日期的数据)
  • 对每个日期,分别将FirstModel和SecondModel按id分组,同步生成对应的FinalModel
  • 合并同一id下的FirstModel数组与SecondModel,直接填充到目标结构中

实现代码

struct FirstModel: Codable {
    var id: Int?
    var date: String?
    var name: String?
}

struct SecondModel: Codable {
    var id: Int?
    var date: String?
    var age: String?
    var position: String?
}

struct FinalModel: Codable {
    var first:[FirstModel]?
    var second: SecondModel?
}

// 定义目标字典类型
typealias MergedDict = [String: [Int?: [FinalModel]]]

func mergeDictionaries(dict1: [String: [FirstModel]], dict2: [String: [SecondModel]]) -> MergedDict {
    var result = MergedDict()
    
    // 收集所有需要处理的日期集合
    let allDates = Set(dict1.keys).union(dict2.keys)
    
    for date in allDates {
        var idToFinalModels = [Int?: [FinalModel]]()
        
        // 处理当前日期的FirstModel,按id分组并生成FinalModel
        if let firstModels = dict1[date] {
            for model in firstModels {
                let id = model.id
                // 初始化id对应的数组(若不存在)
                if idToFinalModels[id] == nil {
                    idToFinalModels[id] = []
                }
                // 创建仅包含FirstModel的FinalModel
                let finalModel = FinalModel(first: [model], second: nil)
                idToFinalModels[id]?.append(finalModel)
            }
        }
        
        // 处理当前日期的SecondModel,合并到对应id的FinalModel中
        if let secondModels = dict2[date] {
            for model in secondModels {
                let id = model.id
                if var existingModels = idToFinalModels[id] {
                    // 更新已有FinalModel的second字段
                    if var targetModel = existingModels.first {
                        targetModel.second = model
                        existingModels[0] = targetModel
                        idToFinalModels[id] = existingModels
                    }
                } else {
                    // 创建仅包含SecondModel的FinalModel
                    let finalModel = FinalModel(first: nil, second: model)
                    idToFinalModels[id] = [finalModel]
                }
            }
        }
        
        result[date] = idToFinalModels
    }
    
    return result
}

// 使用示例
// 原始dict1和dict2定义如题目所示
let mergedResult = mergeDictionaries(dict1: dict1, dict2: dict2)

性能优势

  1. 降低内存开销:无需创建多个中间转换字典,直接从原始数据生成目标结构,减少内存占用
  2. 高效遍历:每个模型仅被遍历一次,时间复杂度为O(M+N)(M为dict1总模型数,N为dict2总模型数),远优于原方案的多次遍历转换
  3. 逻辑简洁:直接从需求出发构建目标结构,避免了中间转换的逻辑复杂度,代码可读性与可维护性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:58