ios - 如何将日期合并到字典中?

标签 ios swift dictionary

我在使用字典时遇到问题。

例如,

我的当前数据

["date": "2018-01-01", "name": "New Year"], ["date": "2018-01-31", "name": "Public holiday"],["date": "2018-02-14", "name": "Valentine's Day"], ["date": "2018-02-28", "name": "Public Holiday"]

我怎样才能转换成

["month": ["January": ["date": "2018-01-01", "name": "New Year"], ["date": "2018-01-31", "name": "Public holiday"]],["February": ["date": "2018-02-14", "name": "Valentine's Day"], ["date": "2018-02-28", "name": "Public Holiday"]]]

最佳答案

您可以使用 DateFormatterString 格式的日期 (yyyy-MM-dd) 读入 Date实例,然后重新使用格式化程序从日期中提取完整的月份名称 (MMMM) 作为您的 String 键。

将其与 reduce(into:) 结合以处理 data 数组:

let data = [
    ["date": "2018-01-01", "name": "New Year"],
    ["date": "2018-01-31", "name": "Public holiday"],
    ["date": "2018-02-14", "name": "Valentine's Day"],
    ["date": "2018-02-28", "name": "Public Holiday"]
]

let monthCategorizedData = data
    .reduce(into: (result: [String: [[String: String]]](),
                   formatter: DateFormatter(),
                   calendar: Calendar(identifier: .gregorian))) {(args, data) in
    var month = "Unknown"
    args.formatter.dateFormat = "yyyy-MM-dd" // format: read date from string
    if let date = data["date"].flatMap({ args.formatter.date(from: $0)}) {
        args.formatter.dateFormat = "MMMM"   // format: read month (as string) from date
        month = args.formatter.string(from: date)
    }
    args.result[month] = args.result[month, default: []] + [data]
}.result

print(monthCategorizedData)
/* ["January":  [["date": "2018-01-01", "name": "New Year"],
                 ["date": "2018-01-31", "name": "Public holiday"]],
    "February": [["date": "2018-02-14", "name": "Valentine\'s Day"],
                 ["date": "2018-02-28", "name": "Public Holiday"]]] */

如果数据具有无效日期(String 形式到 Date 失败,或者 “date” 键不存在于 data), 以上将把它们归类到键 Unknown 中。如果您只想丢弃此类数据(因为这样的失败应该是意外的),您可以将上面的内容修改为:

let monthCategorizedData = data
    .reduce(into: (result: [String: [[String: String]]](),
                   formatter: DateFormatter(),
                   calendar: Calendar(identifier: .gregorian))) {(args, data) in
    args.formatter.dateFormat = "yyyy-MM-dd" // format: read date from string
    if let date = data["date"].flatMap({ args.formatter.date(from: $0)}) {
        args.formatter.dateFormat = "MMMM"   // format: read month (as string) from date
        let month = args.formatter.string(from: date)
        args.result[month] = args.result[month, default: []] + [data]
    }
}.result

将结果进一步嵌套到 [String: [String : [[String : String]]]] 中 "month" 键的值中是直截了当的:

let categorizedData = ["month": monthCategorizedData]

print(categorizedData)
/* ["month": ["January":  [["date": "2018-01-01", "name": "New Year"],
                           ["date": "2018-01-31", "name": "Public holiday"]],
              "February": [["date": "2018-02-14", "name": "Valentine\'s Day"],
                           ["date": "2018-02-28", "name": "Public Holiday"]]]] */

关于ios - 如何将日期合并到字典中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51474043/

相关文章:

ios - 转至聊天 View Controller

ios - 启动应用程序时出现 EXC_BAD_ACCESS 错误

ios - 设置全局色调时 EKEventEditViewController 中的灰色导航项按钮

ios - UITableView 动画行在排序时重新排序

python - Pandas 列内的映射值

python - 使用 numpy.load 时遇到问题

c++ - map 比较构造函数参数

ios - 从添加屏幕发送时 popToRootViewController 不工作

swift - 在 Swift 中使用分区将一些预定义的元素移动到数组的末尾

ios - 这个函数返回的元组有什么问题?