【问题标题】:Sort array of dictionaries where key is unknown对关键字未知的字典数组进行排序
【发布时间】:2018-11-07 17:01:53
【问题描述】:

我有一个[[String:SchoolModel]] 类型的字典数组。键是学校的 id,然后学校模型包含有关学校的信息,例如其名称。我想按 SchoolModel.name 对这个数组进行排序,但不知道如何排序,因为我的键是数组中每个元素的唯一 ID。

struct SchoolModel {
   var name: String
   var city: String
   var state: String
}

【问题讨论】:

  • 那么Array 中的每个Dictionary 只包含一个键值对?那么为什么不使用单个 Dictionary 呢?或者DictionaryLiteral如果您需要订购。
  • 请提供此数组的样本
  • 为什么作为 id 的键不是模型的一部分?但是,您仍然可以执行let sorted = array.sorted(by: { return Array($0.values).first!.name < Array($1.values).first!.name })(强制展开时效果不佳)

标签: arrays swift sorting dictionary


【解决方案1】:

您可以访问每个迭代的字典的第一个值以获取名称。

struct SchoolModel {
    var name: String
    var city: String
    var state: String
}

let schools: [[String:SchoolModel]] = [
    ["1": SchoolModel(name: "1", city: "a", state: "x")],
    ["2": SchoolModel(name: "2", city: "b", state: "y")],
    ["3": SchoolModel(name: "3", city: "c", state: "z")]
]

print(schools.sorted {
    guard
        let a = $0.values.first?.name,
        let b = $1.values.first?.name else { return false }

    return a < b
})

但是,您应该考虑将id 属性添加到您的结构中。您可以将其设为可选,这样您仍然可以启动尚未创建的SchoolModel

struct SchoolModel {
    var id: String?
    var name: String
    var city: String
    var state: String
}

然后,无论您在哪里填充字典数组,都追加 SchoolModel 对象而不将其嵌入字典中,从而生成 [SchoolModel] 类型的数组。

【讨论】:

  • 我将它作为字典的原因是因为我将 ids 存储在我的数据库中作为其他东西的键。但是当我开始打字时,我意识到你我的想法是错误的,你是非常正确的。谢谢
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 2016-03-03
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
相关资源
最近更新 更多