如何快速按月份对日期数组进行分组?

Git*_*itz 5 ios swift

我正在开发一个日程安排应用程序。我想要给定月份的所有日期我无法按月份对日期进行分组,这是我尝试过的,但我想要不同的预期结果

\n\n
extension Date {\n    static func dates(from fromDate: Date, to toDate: Date) -> [Date] {\n        var dates: [Date] = []\n        var date = fromDate\n\n        while date <= toDate {\n            dates.append(date)\n            guard let newDate = Calendar.current.date(byAdding: .day, value: 1, to: date) else { break }\n            date = newDate\n        }\n        return dates\n    }\n    var month: Int {\n        return Calendar.current.component(.month, from: self)\n    }\n}\n\nlet fromDate = Calendar.current.date(byAdding: .day, value: 30, to: Date())\nlet datesBetweenArray = Date.dates(from: Date(), to: fromDate!)\nvar sortedDatesByMonth: [[Date]] = []\nlet filterDatesByMonth = { month in datesBetweenArray.filter { $0.month == month } }\n(1...12).forEach { sortedDatesByMonth.append(filterDatesByMonth($0)) }\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

结果的格式为 [[], [], [], [], [], [], [2019-07-31\n 03:51:19 +0000],\xe2\x80\xa6\xe2 \x80\xa6., [], [], [], []]

\n
\n\n

我想要期待这样的结果

\n\n
struct ScheduleDates {\n    var month: String\n    var dates: [Date]\n\n    init(month: String, dates: [Date]) {\n        self.month = month\n        self.dates = dates\n    }\n}\nvar sections = [ScheduleDates]()\n
Run Code Online (Sandbox Code Playgroud)\n

May*_*ace 5

如果您想按月对日期进行分组,您可以创建Dictionary如下所示的日期:

Dictionary(grouping: datesBetweenArray, by: { $0.month })

这会产生以下格式的输出[Int: [Date]]

字典的关键是你的月份。

现在您可以scheduleDates通过以下方式循环访问此字典来初始化您的结构:

var sections = Dictionary(grouping: datesBetweenArray,
                          by: ({$0.month}))
    .map { tuple in
        ScheduleDates(month: String(tuple.0), dates: tuple.1)
}
Run Code Online (Sandbox Code Playgroud)


Adr*_*ian 4

这是游乐场的代码

我认为你的结构可能应该是Int月份的值,因为当你去填充像表视图这样的东西时,如果你把它们作为Strings.

struct ScheduleDates {
    var month: String
    var dates: [Date]
}
Run Code Online (Sandbox Code Playgroud)

无论如何,这是我根据您提供的内容编写的扩展。坦率地说,我认为你应该返回一个以 Int 作为键、以 Date 数组作为值的字典,但这就是你想要的......

我曾经Dictionary(grouping:by:)根据日期数组构建字典。

extension Date {
    static func dateDictionary(from arrayOfDates: [Date]) -> [String: [Date]] {
        // declare a dictionary
        return Dictionary(grouping: arrayOfDates) { date -> String in
            // get the month as an int
            let monthAsInt = Calendar.current.dateComponents([.month], from: date).month
            // convert the int to a string...i think you probably want to return an int value and do the month conversion in your tableview or collection view
            let monthName = DateFormatter().monthSymbols[(monthAsInt ?? 0) - 1]
            // return the month string
            return monthName
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我编写的用于生成数据的实用方法,同时我弄清楚了如何做到这一点。如果您要投入生产,请不要像我在这里那样强行打开包装。

// Utility method to generate dates
func createDate(month: Int, day: Int, year: Int) -> Date? {
    var components = DateComponents()
    components.month = month
    components.day = day
    components.year = year

    return Calendar.current.date(from: components)!
}
Run Code Online (Sandbox Code Playgroud)

下面是我如何生成一组样本日期来进行实验。

// generate array of sample dates
let dateArray: [Date] = {
    let months = Array(1...12)
    let days = Array(1...31)
    let years = [2019]

    var dateArray: [Date] = []

    while dateArray.count < 100 {
        let randomMonth = months.randomElement()
        let randomDay = days.randomElement()
        let randomYear = years.randomElement()

        if let month = randomMonth,
            let day = randomDay,
            let year = randomYear,
            let date = createDate(month: month,
                                  day: day,
                                  year: year) {
            dateArray.append(date)
        }
    }

    return dateArray
}()

let monthDictionary = Date.dateDictionary(from: dateArray)

var arrayOfStructs: [ScheduleDates] = []

monthDictionary.keys.forEach { key in
    let scheduleDate = ScheduleDates(month: key,
                                     dates: monthDictionary[key] ?? [])
    arrayOfStruct.append(scheduleDate)
}

print(arrayOfStructs)
Run Code Online (Sandbox Code Playgroud)