swift - 在 tableview 中对动态部分进行排序 | 迅速
问题描述
如何对从该datestamp
字段动态生成的以下部分进行排序?例如调用的部分2021-11-3
需要显示在上面的tableview中2021-11-2
日期戳格式: 2021-11-3
var sections = [mySections]()
var structure = [myStructure]()
private func fetchJSON() {
guard let url = URL(string: "test.com")
else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = "id=\1".data(using: .utf8)
URLSession.shared.dataTask(with: request) { data, _, error in
guard let data = data else { return }
do {
let decoder = JSONDecoder()
self.structure.sort { $0. datestamp > $1.datestamp }
let res = try decoder.decode([myStructure].self, from: data)
let grouped = Dictionary(grouping: res, by: { $0. datestamp })
let keys = grouped.keys.sorted()
self.sections = keys.map({mySections(date: $0, items: grouped[$0]!
)})
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
catch {
print(error)
}
}.resume()
}
我尝试过以下操作,self.sections
但它没有做任何事情:
self.sections.sorted { $0.date > $1.date }
结构:
struct mySections {
let date : String
var items : [myStructure]
}
struct myStructure: Decodable {
let recordid: Int
let testname: Int
let datestamp: String
}
数据示例:
[
{
"recordid": 1,
"testname": "Jen",
"datestamp": "2021-11-3"
},
{
"recordid": 1,
"testname": "Jake",
"datestamp": "2021-11-2"
}
]
解决方案
现在,您正在structure
根据 进行排序dateTimeStamp
,它什么也不做,因为其中structure
没有任何数据。
在我的游乐场示例中,就像您的代码一样,我使用了Dictionary(grouped:)
. 然后,我将map
那些结果mySections
与sort
.date
最后的结果print
是:
[“2021-11-4”、“2021-11-3”、“2021-11-2”]
let data = """
[
{
"recordid": 1,
"testname": "Jake",
"datestamp": "2021-11-2"
},
{
"recordid": 2,
"testname": "Jen",
"datestamp": "2021-11-3"
},
{
"recordid": 3,
"testname": "Bob",
"datestamp": "2021-11-3"
},
{
"recordid": 4,
"testname": "Bill",
"datestamp": "2021-11-4"
}
]
""".data(using: .utf8)!
struct mySections {
let date : String
var items : [myStructure]
}
struct myStructure: Decodable {
let recordid: Int
let testname: String
let datestamp: String
}
var sections = [mySections]()
var structure = [myStructure]()
do {
let decoder = JSONDecoder()
let res = try decoder.decode([myStructure].self, from: data)
let grouped = Dictionary(grouping: res, by: { $0.datestamp })
sections = grouped.map { mySections(date: $0.key, items: $0.value) }
.sorted { $0.date > $1.date }
print(sections.map(\.date))
} catch {
print(error)
}
可能值得注意的是,现在您的日期以统一格式存储,非常适合基于字符串的排序。但是,如果您的端点返回的日期格式不统一(如2021-11-04
和2021-11-3
),您可能希望转换为实际的Date
第一个日期并根据该日期进行排序。
推荐阅读
- python - 如何在 Windows 中为 Redis 桌面管理器实现自定义格式化程序?
- uwp - 使用 winrt::implements 和 winrt::make 时出错
- javascript - 在 React Native 中搜索 Expo-Contacts
- javascript - 面向对象编程:另一种实现状态模式的方法?
- haskell - 如何在 lambda 参数上运行函数以在 Haskell 的嵌套 lambda 中使用?
- r - 用 NA 替换特定范围的数字
- javascript - 让我的 JS 函数显示在正确的位置
- android - 预期为 BEGIN_ARRAY,但在行中为 BEGIN_OBJECT
- javascript - 如何合并 2 个数组并创建一个具有唯一值的新数组,如 Union?
- string - Oracle:更新表,其中字符串变量中的数字列