Swift如何将[Dictionary<String, [String:Double]>.Element]转为[String:[String:Double]]
问题原因
- 第一,你的
decodedModel是try?返回的可选类型[JSONModel]?,未解包无法直接操作数组元素 - 第二,
flatMap用法不符合需求:你对数组元素调用flatMap返回单个键值对字典时,flatMap会把所有字典拆成键值对元组组成的数组,无法直接生成目标字典类型,所以报类型不匹配错误。
正确实现
有两种常用实现方案:
方案1:使用Dictionary(uniqueKeysWithValues:)(推荐,name无重复时使用)
先对decodedModel解包,再把每个元素映射为(name, model)的元组,直接传入字典构造方法即可:
// 先安全解包解码结果,解码失败时默认赋值为空字典 let simplifiedModel: [String: [String: Double]] if let decodedModel = decodedModel { simplifiedModel = Dictionary(uniqueKeysWithValues: decodedModel.map { ($0.name, $0.model) }) } else { simplifiedModel = [:] }
也可以用可选链简写:
let simplifiedModel = decodedModel.map { Dictionary(uniqueKeysWithValues: $0.map { ($0.name, $0.model) }) } ?? [:]
方案2:使用reduce(into:)(兼容name重复的场景)
如果存在name重复的场景,你可以自定义重复值的处理逻辑:
let simplifiedModel = decodedModel.reduce(into: [String: [String: Double]]()) { result, item in // 重复name时默认覆盖旧值,需要保留旧值就加判断 if result[item.name] == nil result[item.name] = item.model } ?? [:]
内容的提问来源于stack exchange,提问作者Another Dude
相关产品推荐
相关产品推荐

