目前,我有一个嵌套的字典声明为:
let VitamineARetinol = "VitamineARetinol"
let VitamineABetacarotene = "VitamineABetacarotene"
let VitamineC = "VitamineC"
let VitamineD = "VitamineD"
let Calories = "Calories"
typealias ListOfAliment = [String: [String: Double]]
let Data: ListOfAliment = [
"Orange": [VitamineARetinol: 0.5, VitamineC: 0.3, VitamineD: 0.98, Calories: 160],
"Pomme": [VitamineARetinol: 0.2, VitamineC: 0.2, VitamineD: 0.38, Calories: 120],
"Poire": [VitamineARetinol: 0.1, VitamineC: 0.7, VitamineD: 0.58, Calories: 140],
"Laitue": [VitamineARetinol: 0.3, VitamineC: 0.1, VitamineD: 0.92, Calories: 105],
"Banane": [VitamineARetinol: 0.7, VitamineC: 0.01, VitamineD: 0.63, Calories: 122],
]
我需要在以下字典中将每个值除以其对应的值:
let reference: ListOfAliment = [
"reference": [VitamineARetinol: 0.2, VitamineC: 0.1, VitamineD: 0.4],
]
最后,我应该得到一个食物字典,其中每种食物的所有值都被字典参考中的相应值除以 拜托,有人可以帮我吗!
答案 0 :(得分:1)
鉴于我在previous question中的回答,您可以简单地将值数组映射到新数组中
let adjustedData = array
.map { Aliment(name: $0.name,
vitamineARetinol: $0.vitamineARetinol / 0.2,
vitaminC: $0.vitaminC / 0.1,
vitaminD: $0.vitaminD / 0.4,
calories: $0.calories)}
答案 1 :(得分:0)
您绝对应该为内部词典创建一个结构。因为这样您可以在结构中添加dividedBy
方法来进行除法。我不确定将一种食物除以另一种食物是否有意义。如果是这样,您可以将divideBy
方法更改为接受另一个Aliment
。
struct Aliment {
let vitaminARetinol: Double
let vitaminC: Double
let vitaminD: Double
let calories: Double
func dividedBy(vitaminARetinolFactor: Double, vitaminCFactor: Double, vitaminDFactor: Double, caloriesFactor: Double) -> Aliment {
Aliment(vitaminARetinol: vitaminARetinol / vitaminARetinolFactor,
vitaminC: vitaminC / vitaminCFactor,
vitaminD: vitaminD / vitaminDFactor,
calories: calories / caloriesFactor)
}
}
typealias ListOfAliment = [String: Aliment]
let data: ListOfAliment = [
"Orange": Aliment(vitaminARetinol: 0.5, vitaminC: 0.3, vitaminD: 0.98, calories: 160),
"Pomme": Aliment(vitaminARetinol: 0.2, vitaminC: 0.2, vitaminD: 0.38, calories: 120),
"Poire": Aliment(vitaminARetinol: 0.1, vitaminC: 0.7, vitaminD: 0.58, calories: 140),
"Laitue": Aliment(vitaminARetinol: 0.3, vitaminC: 0.1, vitaminD: 0.92, calories: 105),
"Banane": Aliment(vitaminARetinol: 0.7, vitaminC: 0.01, vitaminD: 0.63, calories: 122),
]
要转换字典,可以使用mapValues
:
let referenceNumbers = reference["reference"]!
let newData = data.mapValues {
$0.dividedBy(vitaminARetinolFactor: referenceNumbers[VitamineARetinol]!,
vitaminCFactor: referenceNumbers[VitamineC]!,
vitaminDFactor: referenceNumbers[VitamineD]!,
caloriesFactor: referenceNumbers[Calories]!)
}
同样,如果有意义的是将一种食物分割为另一种,则您也可以将引用设为Aliment
对象,并将其传递给divideBy
。