SwiftUI 从结构体(来自 JSON)获取唯一值

问题描述 投票:0回答:1

我是 Swift 新手,一直被一个简单的问题困扰......

背景:

  • 我正在尝试构建一个食谱应用程序,该应用程序为一周中的每一天(7 天)提供不同的食谱

  • 一个json包含层次结构中的所有数据:天 -> 有多个食谱 -> 有多个成分,其中成分具有以下格式:

         "ingredients": [
            {
                "item": "cereal",
                "amount": 1,
                "units": "cup(s)"
            },
            {
                "item": "milk",
                "amount": 0.2,
                "units": "L"
            }
         ]
    

期望的结果:

  • 我想要实现的是一个购物清单,显示所有食谱所需的所有物品的唯一列表

到目前为止我走了多远:

数据是以这种有效格式从 json 中提取的:

struct Day: Hashable, Codable, Identifiable {

    //Breakfast
    var breakfastData: mealResponse
    //Dinner
    var dinnerData: mealResponse
    
    struct mealResponse: Hashable, Codable {
        struct IngredientResponse: Hashable, Codable {
            var item: String
            var amount: Double
            var units: String
        }
    }
}

然后我设法获得完整的成分列表,如下所示:

ForEach(userData.days, id: \.self) { day in
                ForEach(day.breakfastData.ingredients, id: \.self) {ingredient in
                    Text(ingredient.item)
                    }
                }

但这不是一个独特的列表(它只是每天都会浏览并列出了本例中早餐食谱的所有成分......) 非常感谢您对此提供一些帮助 - 实际上花了数周时间尝试各种事情......

奖金:

  • 下一步是显示这个唯一列表旁边的“数量”总和,以便用户知道他/她需要多少每种成分来制作 json 中的所有食谱
swift swiftui
1个回答
0
投票

要获取所有成分的数组,您可以使用

reduce
并使用
Set
仅添加独特的成分

let allIngredients = Array(days.reduce(into: Set<String>()) {
    $0.formUnion($1.breakfastData.ingredients.map(\.item))
    $0.formUnion($1.dinnerData.ingredients.map(\.item))
})
© www.soinside.com 2019 - 2024. All rights reserved.