通过其字段的不同值对Realm对象进行分组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过其字段的不同值对Realm对象进行分组相关的知识,希望对你有一定的参考价值。
我正在寻找更优雅的方法来过滤和通过其字段的不同值对领域对象进行分组。
我有类型为Task的领域对象,类型为Date的字段。我想白天将这些对象分组。
class Task: Object {
@objc dynamic var name: String
@objc dynamic var date: Date
//... other Realm Object implementation ...
}
我创建了特殊的结构来存储和表示日期并将它们彼此区分开来。
struct Day: Hashable {
var month: Int
var year: Int
var day: Int
var hashValue: Int {
return (year * 12 * 30) + (month * 30) + day
}
}
然后将每个任务的日期添加到Set中。
var days: Set<Day> = [] //moth, year, day
allRecords
.forEach {
let components = Calendar.current.dateComponents([.month, .year, .day], from: $0.date)
days.insert(Day(month: components.month!, year: components.year!, day: components.day!))
}
然后每天过滤所有任务。
let history = days.map { day -> (String, Task) in
let dayRecords = allRecords.filter { record in
let components = Calendar.current.dateComponents([.month, .year, .day], from: record.date)
return components.year == day.year && components.month == day.month && components.day == day.day
}
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE, MMM d"
return (
"(dateFormatter.string(from: dayRecords.first?.date ?? Date()))",
dayRecords)
})
}
这段代码可以正常运行,但是我确信有一种方法可以让它更优雅,更简洁。
我的第一个想法:可能是我应该将日期存储为日课。我的第二个想法:必须有一种通过它的内部对象的字段值排队对象的方法。
提前致谢!
P.S:可能我的问题类似于this,但有领域和快速。
答案
如果我理解正确,这就是你要找的东西:
let tasksByDate = Dictionary(grouping: tasks) {
return Calendar.current.dateComponents([.year, .month, .day], from: $0.date)
}
这将创建一个字典,其中包含按日期(键)分组的任务(值)。
文档:https://developer.apple.com/documentation/swift/dictionary/3127163-init
以上是关于通过其字段的不同值对Realm对象进行分组的主要内容,如果未能解决你的问题,请参考以下文章
如何在reactjs / javascript中按值对对象数组进行分组