【问题标题】:Sort the Data from JSON as per the Date and Set Tableview section Title as date and following data as per the Date根据日期对 JSON 中的数据进行排序,并将 Tableview 部分的标题设置为日期,并根据日期对以下数据进行排序
【发布时间】:2020-01-03 05:11:48
【问题描述】:

JSON 文件:

{
    "success": 1,
    "msg": "User Phone Usage",
    "data": [
        {
            "date": "2019-12-19",
            "val": [
                {
                    "ride_id": 44,
                    "date": "2019-12-19 09:32:19",
                    "total_km": null,
                    "startTime": "2019-12-19 09:32:19",
                    "endTime": "2019-12-19 09:37:08",
                    "rides": 0
                },
                {
                    "ride_id": 43,
                    "date": "2019-12-19 09:28:16",
                    "total_km": null,
                    "startTime": "2019-12-19 09:28:16",
                    "endTime": "2019-12-19 09:32:23",
                    "rides": 0
                },
                {
                    "ride_id": 42,
                    "date": "2019-12-19 09:28:12",
                    "total_km": null,
                    "startTime": "2019-12-19 09:28:12",
                    "endTime": "2019-12-19 09:29:13",
                    "rides": 0
                }
            ]
        },
        {
            "date": "2019-12-13",
            "val": [
                {
                    "ride_id": 2,
                    "date": "2019-12-13 08:14:34",
                    "total_km": 12.64,
                    "startTime": "2019-12-13 08:14:34",
                    "endTime": "2019-12-18 03:49:43",
                    "rides": 2
                }
            ]
        },
        {
            "date": "2019-12-12",
            "val": [
                {
                    "ride_id": 1,
                    "date": "2019-12-12 06:59:26",
                    "total_km": 101.36,
                    "startTime": "2019-12-12 06:59:26",
                    "endTime": "2019-12-18 03:07:00",
                    "rides": 0
                }
            ]
        }
    ]
}

所以我必须将 tableview 部分标题设置为 (date) 并显示在该特定日期发生的事件。

下面是我必须实现的示例图片

部分标题是日期和总公里数,游乐设施是我要根据指定日期填充的行。 API 数据保存在模型类中,而不是字典格式,因此需要一些解决方案,我可以对数据进行排序并将其显示在表格视图中。

模型类:

class ShowDetails
{

    var startRideDateTime:String?
    var rideID:Int?
    var endRideDateTime:String?
    var totalKM:Double?
    var rides:Int?


    init(rideID: Int?,totalKM: Double?, startRideDateTime: String?, endRideDateTime: String?, rides: Int?) {
        self.rideID = rideID
        self.totalKM = totalKM
        self.startRideDateTime = startRideDateTime
        self.endRideDateTime = endRideDateTime
        self.rides = rides
    }


}

视图控制器代码: showdetailsArray 是 API Response 中保存的数组

func grouping()
    {

        let groupData = Dictionary(grouping: self.showDetailsArray){ (element) -> String in
            return (element.startRideDateTime ?? "")
        }

        groupData.forEach { (key) in
            print("VALUES")
            print(groupData.values)
        }


    }

【问题讨论】:

  • 到目前为止你有没有尝试过?
  • 尝试了一些解决方案,但我无法实现。但现在我刚刚创建了一个可以保存的模型类。来自API的数据,也尝试了字典的分组方法,但无法提取值。 ``` let groupData = Dictionary(grouping: self.showDetailsArray){ (element) -> String in return (element.startRideDateTime ?? "") } groupData.forEach { (key) in print("VALUES") print(groupData .values) } ```
  • 在此处添加您尝试过的代码。
  • 我将编辑问题。这样会更清楚
  • 为什么不使用 Codable

标签: json swift xcode swift4.2


【解决方案1】:
class ShowDetails {
    var startRideDateTime:String?
    var rideID:Int?
    var endRideDateTime:String?
    var totalKM:Double?
    var rides:Int?

    init(rideID: Int?,totalKM: Double?, startRideDateTime: String?, endRideDateTime: String?, rides: Int?) {
        self.rideID = rideID
        self.totalKM = totalKM
        self.startRideDateTime = startRideDateTime
        self.endRideDateTime = endRideDateTime
        self.rides = rides
    }
}

class myData {
    let date: String // this value should not be optional as you are sorting on basis of this
    let value: [ShowDetails]?

    init(date: String, value: [ShowDetails]?) {
        self.date = date
        self.value = value
    }
}

// set your data here
var data:[myData] = []

// this is the array sorted according to date
data.sort(by: { $0.date > $1.date })

【讨论】:

    【解决方案2】:

    使用 Codable 进行数据解析,然后根据日期对其进行排序。

    您可以使用的模型,

    struct Root: Decodable {
        var data: [Model]
    }
    
    struct Model: Decodable {
        let date: String
        let val: [Ride]
    }
    
    struct Ride: Decodable {
        let rideId: Int
        let date: String
        let totalKm: Double?
        let startTime: String
        let endTime: String
    }
    

    现在,像这样解析数据,

    do {
        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase
        var response = try decoder.decode(Root.self, from: data)
        response.data.sort { $0.date < $1.date }
        print(response)
    } catch {
        print(error)
    }
    

    在上面的代码中,使用response 作为你的tableView's dataSource。

    【讨论】:

    • 我已经尝试了这两种代码,但无法实现,因为它将数据与下一个日期与时间进行比较,因此如果时间更改,它会添加新闻部分,因此会出现 2 个相同日期的部分在表格视图中。但感谢您的回答。我已经得到了我将添加的解决方案。
    【解决方案3】:

    因此,如果有人需要,我找到了 Ans 的解决方案: 最后将数据保存到类模型中后,您可以将此代码添加到排序中。

    func groupingByDate()
            {
                let groupData = Dictionary(grouping: self.showDetailsArray){ (element) -> String in
                    return (element.startRideDate ?? "") //It fetches the element from model class array and set as key of dictionary and other elements as values
                }
    
    
                groupData.keys.forEach { (key) in
    
                    let values = groupData[key]
                    twoDArray.append(values ?? []) //twoDArray is a two dimensional Array           
                }
                   //reloadTableview if you want
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 2020-07-02
      相关资源
      最近更新 更多