在Swift中将一本字典与另一本字典相乘

时间:2020-08-11 08:57:14

标签: swift dictionary nested

目前,我有一个嵌套的字典声明为:

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],
]

最后,我应该得到一个食物字典,其中每种食物的所有值都被字典参考中的相应值除以 拜托,有人可以帮我吗!

2 个答案:

答案 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