【问题标题】:How to sort an array of dictionary in swift 4如何在swift 4中对字典数组进行排序
【发布时间】:2018-11-24 03:50:15
【问题描述】:

这是我的 NSObject 类

class CustomDate: NSObject {
    var quarter: Int!
    var day: String!
    var month: String!
    var db: String!
    var long: String!
    var unix: Int!

    init(quarter: Int, day: String, month: String, db: String, long: String, unix: Int) {
        super.init()

        self.quarter = quarter
        self.day = day
        self.month = month
        self.db = db
        self.long = long
        self.unix = unix
    }
}

我创建的用于存储 CustomDate 的变量

var dates = [CustomDate]()

我正在从字典中的 json 中获取 6 个键值对中的数据,正如您所见,下面的照片正在打印日期和月份。但我需要按升序(或降序)对 json 数据进行排序。我该怎么做,这是我的代码。我正在使用 alamofire 获取数据并创建一个 NSObject 类来存储数据

func apiData() {
    Alamofire.request("https://api.lrs.org/random-date-generator?lim_quarters=40&source=api-docs", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            guard let json = response.result.value as? [String: Any] else { return }
            guard let data = json["data"] as? [String: Any] else { return }

            for (_, value) in data {
                let dateValue = value as! [String: Any]
                let date = CustomDate(quarter: dateValue["quarter"] as! Int,
                                      day: dateValue["day"] as! String,
                                      month: dateValue["month"] as! String,
                                      db: dateValue["db"] as! String,
                                      long: dateValue["long"] as! String,
                                      unix: dateValue["unix"] as! Int)

                self.dates.append(date)
            }
            print(self.dates)
            break
        case .failure(_):
            print(response.result.error as Any)
            break
        }
    }
}

例如照片

【问题讨论】:

  • 需要对哪个值进行排序?
  • 我需要排序的月份值
  • 然后在您的自定义类中使用排序函数按月排序
  • 先生,我该怎么做?
  • 这是你的代码 let newArr = dates.sorted(by: { (objModel, objModel1) -> Bool in return (Int(objModel.month ?? "0") ?? 0)

标签: ios arrays swift dictionary swift4


【解决方案1】:

您可以按此对自定义数组进行排序。 sortHigh order 函数之一,用于对自定义数组进行排序。

func apiData() {

    Alamofire.request("https://api.lrs.org/random-date-generator?lim_quarters=40&source=api-docs", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            guard let json = response.result.value as? [String: Any] else { return }
            guard let data = json["data"] as? [String: Any] else { return }

            for (_, value) in data {
                let dateValue = value as! [String: Any]
                let date = CustomDate(quarter: dateValue["quarter"] as! Int,
                                      day: dateValue["day"] as! String,
                                      month: dateValue["month"] as! String,
                                      db: dateValue["db"] as! String,
                                      long: dateValue["long"] as! String,
                                      unix: dateValue["unix"] as! Int)

                self.dates.append(date)
            }
            print("unsorted array \(self.dates.map({$0.month})))")
            self.dates = self.dates.sorted(by: { (objModel, objModel1) -> Bool in return
                (Int(objModel.month ?? "0") ?? 0) < (Int(objModel1.month ?? "0") ?? 0)
            })
            print("sorted array \(self.dates.map({$0.month}))")
            break
        case .failure(_):
            print(response.result.error as Any)
            break
        }
    }
}

【讨论】:

  • 我在这个中得到零值......我把这段代码放在 viewdidLoad 方法中
  • 你在 print(self.dates) 声明之后尝试过这个吗?
  • 是的,它显示错误定义与以前的值冲突
  • 等我在这里试试
  • @viper 在这里完全可以正常工作。我用同样的东西让我放截图
【解决方案2】:

要按数字顺序比较字符串,请使用 localizedStandardCompare,其排序类似于 Finder

dates.sort(by: {$0.month.localizedStandardCompare($1.month) == .orderedAscending})

compare 带有选项numeric

dates.sort(by: {$0.month.compare($1.month, options: .numeric) == .orderedAscending})

最好的解决方案可能是将month 声明为Int

【讨论】:

  • 如果你比较字符串输出是不需要的,因为它比较 ASCII 值
  • @chiragshah 它 想要的,相信我。在 ASCII 中 "10" 小于 "2"
  • @vadian 但如果我有 "1","12","2" 值,则排序为 "1" , "12" 和 "2" 不像它有。
  • @chiragshah 我认为 OP 想要订单"1", "2", "12"
  • 在分段控件的操作中,您必须通过适当的属性对数组重新排序。
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 2016-07-14
  • 2015-09-28
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多