我在使用字典时遇到问题。
例如,
我的当前数据
["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"]]]
最佳答案
您可以使用 DateFormatter
将 String
格式的日期 (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/