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)
性能优势
- 降低内存开销:无需创建多个中间转换字典,直接从原始数据生成目标结构,减少内存占用
- 高效遍历:每个模型仅被遍历一次,时间复杂度为
O(M+N)(M为dict1总模型数,N为dict2总模型数),远优于原方案的多次遍历转换 - 逻辑简洁:直接从需求出发构建目标结构,避免了中间转换的逻辑复杂度,代码可读性与可维护性更高
内容的提问来源于stack exchange,提问作者solitary
相关产品推荐
相关产品推荐

