【问题标题】:Convert nested dictionary to create String Swift转换嵌套字典以创建 String Swift
【发布时间】:2021-05-21 08:55:22
【问题描述】:

我有一个字典,其中包含值的键和项模型。

var selectedDic: [String: [Item]] = [:]

  • 实际上我正在尝试使用字典键创建一个字符串,并且键具有多个用逗号分隔的值。
  • 如果我向键添加更多值,它应该向特定键添加值。
  • pricepublisher 是键,itemId 是值。

我需要这个字符串:price:10-25;publisher:576,925,1737

字典打印:

[
  "price": [
    Babil.Item(name: Optional("10 - 25"),
    itemId: Optional("10-25"))
  ],
  "publisher": [
    Babil.Item(name: Optional("ABCD"),
    itemId: Optional("576")),
    Babil.Item(name: Optional("DEFG"),
    itemId: Optional("925")),
    Babil.Item(name: Optional("HIJK"),
    itemId: Optional("1737"),
    )
  ]
]

我的代码:

 var itemString: [String: String] = [:]
 var str: [String] = []
        
   for (key, value) in selectedDic {
            value.forEach { a in
                if str.firstIndex(of: key) == nil {
                    str.append(a.itemId!)
                }
            }
            
            let final = str.joined(separator: ",")
            itemString.updateValue(final, forKey: key)
            
        }

【问题讨论】:

  • let priceStr = itemString["price"]?.compactMap{ $0.name }.joined(separator: ","); let publisherStr = itemString["publisher"]?.compactMap{ $0.itemId } .joined(separator:","); let finalStr = [priceStr, publisherStr].compactMap{ $0 }.joined(separator: ";") 或类似的东西?但是了解您当前的产量会有所帮助,可以有多个价格吗?为什么使用 Dict 而不是另一个自定义结构?为什么nameitemIdItem 中都是可选的?这正常吗?
  • @Larme 首先谢谢你。但在创建字符串之前,它也会将值复制到其他键。请参阅 - ["price": "10-25", "publisher": "10-25,576,925,1737"] 10-25 在发布者中。

标签: ios swift string dictionary


【解决方案1】:

与:

struct Item {
    let name: String?
    let itemId: String?
}

let dict: [String: [Item]] = ["price": [Item(name: "10-25", itemId: "10-25")],
                              "publisher": [Item(name: "ABCD", itemId: "576"),
                                            Item(name: "DEFG", itemId: "925"),
                                            Item(name: "HIJK", itemId: "1737")]]


你可以使用:

var keys = ["price", "publisher"]
let reduced = keys.reduce(into: [String]()) { result, current in
    guard let items = dict[current] else { return }
    let itemsStr = items.compactMap {$0.itemId }.joined(separator: ",")
    result.append("\(current):\(itemsStr)")
}
let finalStr = reduced.joined(separator: ";")
print(finalStr)

想法: 遍历所需的键(并保证顺序),为每个键构建以“,”连接的 itemsIds 列表,然后将其附加到键中。 最后,加入所有这些。

附加问题: 为什么nameitemId 是可选的?这正常吗?

网站注释:给出第一部分(易于重现的输入)可以增加答案的变化,因此我们不必重新创建自己的假数据来检查我们的答案。

【讨论】:

  • 谢谢。 nameitemId 是正常的,此时后端服务处于初始阶段。
【解决方案2】:

试试这个: 键的顺序可以不同,因为它是一个字典,并且顺序在字典中并不重要

print(
    yourDict.map { (key, values) -> String in
        "\(key): \(values.compactMap { $0.itemId }.joined(separator: ","))"
    }.joined(separator: ";") 
)

【讨论】:

    猜你喜欢
    • 2015-08-25
    • 2021-05-05
    • 2023-03-12
    • 2019-05-02
    • 2023-01-18
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多