通过其字段的不同值对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对象进行分组的主要内容,如果未能解决你的问题,请参考以下文章

Realm保留一个已删除的对象

如何在reactjs / javascript中按值对对象数组进行分组

按值对行进行分组,直到它更改(分组包括第一个更改的值)

数据聚合与分组运算

我有不同的类,我想用这些类中的对象制作一个向量并按值对其进行排序

如何对一组对象进行分组并将其映射到不同的结构?