【问题标题】:Sorting nested dictionary in Swift4 by Key在 Swift4 中按键对嵌套字典进行排序
【发布时间】:2019-08-12 19:41:39
【问题描述】:

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

var userSchedule = [String:[String:String]]()

我得到如下结果:

["2": ["time": "tbd", "date": "1/15", "name": "Chris"], 
 "0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"], 
 "1": ["time": "1:15PM", "date": "1/15", "name": "John"]]

我想对该结果进行排序,以便结果按第一个键排序。

所以:

["0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"], 
 "1": ["time": "1:15PM", "date": "1/15", "name": "John"], 
 "2": ["time": "tbd", "date": "1/15", "name": "Chris"]]

如何在 Swift4 中有效地做到这一点?请帮忙!

【问题讨论】:

  • Dictionary 是无序的,不能排序。无论如何,您可以从中创建Array
  • 字典是无序集合,不能排序。您需要使用其他一些集合并实现逻辑来转换此字典并对其进行排序。提示:字典数组,其中每个索引表示其对应字典键的数值。
  • 我建议您创建结构而不是使用字典。然后,您可以拥有一个结构数组并对其进行排序
  • Sort Dictionary by keys的可能重复

标签: ios swift sorting dictionary swift4


【解决方案1】:

创建一个结构来保存值并将您的字典映射到该结构的数组

struct Schedule {
    let key: Int?
    let time: String?
    let date: String?
    let name: String?
}

var orderedSchedule = userSchedule.map { Schedule(key: Int($0.key), 
                                                  time: $0.value["time"], 
                                                  date: $0.value["date"], 
                                                  name: $0.value["name"]) }

orderedSchedule.sort { ($0.key ?? 0) < ($1.key ?? 0) }

【讨论】:

    【解决方案2】:

    Dictionary 无序,无法排序。


    但是,在你的情况下,我会摆脱字典,我只会有你的模型数组。

    创建代表您的事件的自定义 struct,然后您可以按模型的 id 属性对数组进行排序

    struct Event {
        let time, date, name: String
        let id: Int
    }
    
    var userSchedule = [Event(time: "tbd", date: "1/15", name: "name", id: 2),
                        Event(time: "6:16 PM", date: "1/15", name: "Chris", id: 0),
                        Event(time: "1:15PM", date: "1/15", name: "John", id: 1)]
    
    userSchedule.sort { $0.id < $1.id }
    

    例如,如果您要从服务器获取字典作为响应,则可以使用 compactMap 将其重新映射到 Event 数组

    struct Event {
        let time, date, name: String
        let id: Int
    }
    
    var userSchedule = ["2": ["time": "tbd", "date": "1/15", "name": "Chris"],
                        "0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"],
                        "1": ["time": "1:15PM", "date": "1/15", "name": "John"]]
    
    var schedule = userSchedule.compactMap { (event) -> Event? in
        guard let time = event.value["time"], let date = event.value["date"], let name = event.value["name"], let id = Int(event.key) else { return nil }
        return Event(time: time, date: date, name: name, id: id)
    }
    
    schedule.sort { $0.id < $1.id }
    

    【讨论】:

      【解决方案3】:

      你可以这样做:首先将它排序为一个数组,然后用字典元素构建一个数组。很简单,只有两行代码。

      var userSchedule = ["2": ["time": "tbd", "date": "1/15", "name": "Chris"],
      "0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"],
      "1": ["time": "1:15PM", "date": "1/15", "name": "John"]]
      
      let userScheduleArray = userSchedule.sorted{$0.key < $1.key}
      
      print(userScheduleArray) 
      //[(key: "0", value: ["time": "6:16 PM", "date": "1/15", "name": "Bob"]), (key: "1", value: ["time": "1:15PM", "date": "1/15", "name": "John"]), (key: "2", value: ["time": "tbd", "date": "1/15", "name": "Chris"])]
      
      let separatedDict = userScheduleArray.map{Dictionary(uniqueKeysWithValues: [$0])}
      
      print(separatedDict)
      //[["0": ["time": "6:16 PM", "date": "1/15", "name": "Bob"]], 
      // ["1": ["time": "1:15PM", "date": "1/15", "name": "John"]], 
      // ["2": ["time": "tbd", "date": "1/15", "name": "Chris"]]]
      
      print(type(of: separatedDict))
      //[[String:[String:String]]] i.e. Array<Dictionary<String, Dictionary<String, String>>> 
      

      【讨论】:

        猜你喜欢
        • 2020-01-22
        • 2018-07-03
        • 1970-01-01
        • 2014-05-01
        • 2019-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-18
        相关资源
        最近更新 更多