我有一个数组字典,通过将数组按date
分组来创建(数组的元素具有date
和time
属性,它们都是 Date
对象):
let groupedData = Dictionary(grouping: array, by: { $0.date })
现在,我希望字典中的每个数组都按time
属性进行排序。你有什么建议?
答案 0 :(得分:0)
如果要显示按日期将对象分组的数组以显示在表格视图的部分中,则您没有字典,您需要的是2D数组。您可以先对对象进行分组,然后再按日期对它们进行排序,然后可以使用collection的reduce(into :)方法,并检查last array last element date属性是否与当前元素date在同一天。基于此,您将把对象附加到结果的最后一个集合中,并使用该元素附加一个新数组:
struct Obj {
let date: Date
}
extension Obj: CustomStringConvertible {
var description: String { return "Obj(date: \(date.description(with: .current))" }
}
我创建了一个自定义初始化程序,以使其更易于生成一些日期对象进行测试:
extension Date {
init?(year: Int, month: Int, day: Int, hour: Int) {
guard let date = DateComponents(calendar: .current, year: year, month: month, day: day, hour: hour).date else { return nil }
self.init(timeInterval: 0, since: date)
}
}
let objs = [(2019, 1, 26, 6),
(2019, 1, 26, 7),
(2019, 1, 27, 10),
(2019, 1, 27, 11),
(2019, 1, 28, 13),
(2019, 1, 28, 14),
(2019, 1, 28, 15)]
.compactMap(Date.init)
.map(Obj.init)
let groupedData: [[Obj]] = objs.sorted{ $0.date < $1.date }
.reduce(into: []) {
if let date = $0.last?.last?.date,
Calendar.current.isDate(date, inSameDayAs: $1.date) {
$0[$0.index(before: $0.endIndex)].append($1)
} else {
$0.append([$1])
}
}
groupedData.forEach {
print($0)
}