swift - swift 总结每日日期中的相似月份对象

标签 swift

伙计们,我的数据库结构用于存储每日步数数据。我需要将每日步骤汇总为每月。这是我的要求如下

//Daily Data from DB
let dailyData = [["steps": 1000,
                  "date": 2018/04/28],
                 ["steps": 1000,
                  "date": 2018/04/29],
                 ["steps": 1000,
                  "date": 2018/04/30],
                 ["steps": 1000,
                  "date": 2018/04/01],
                 ["steps": 1000,
                  "date": 2018/05/02],
                 ["steps": 1000,
                  "date": 2018/05/03],
                 ["steps": 1000,
                  "date": 2018/05/04],
                 ["steps": 1000,
                  "date": 2018/05/05],
                 ["steps": 1000,
                  "date": 2018/06/06],
                 ["steps": 1000,
                  "date": 2018/06/07]]

//I need to sum daily data to monthly data as follows
let monthlyData = [["steps": 4000,
                    "month": April],
                   ["steps": 4000,
                    "month": May],
                   ["steps": 2000,
                    "month": June]]

请帮我解释一下逻辑。在日常数据中,我在字符串和日期中也有日期类型。

最佳答案

    let dailyData: [[String: Any]] =
                    [["steps": 1000, "date": "2018/04/28"],
                     ["steps": 1000, "date": "2018/04/29"],
                     ["steps": 1000, "date": "2018/04/30"],
                     ["steps": 1000, "date": "2018/04/01"],
                     ["steps": 1000, "date": "2018/05/02"],
                     ["steps": 1000, "date": "2018/05/03"],
                     ["steps": 1000, "date": "2018/05/04"],
                     ["steps": 1000, "date": "2018/05/05"],
                     ["steps": 1000, "date": "2018/06/06"],
                     ["steps": 1000, "date": "2018/06/07"]]

    let groupedDict = Dictionary(grouping: dailyData, by: { ($0["date"] as! String).prefix(7) })
    let mappedDict = groupedDict.map { ["month": findMonth(str: String($0)), "steps": $1.map({ $0["steps"] ?? 0 }) ] }
    let result = mappedDict.map { ["month": $0["month"] ?? "", "steps": ($0["steps"] as! [Int]).reduce(0, { $0 + $1 }) ] }
    print(result)

在哪里,

func findMonth(str: String) -> String {
    let dateformatter = DateFormatter()
    dateformatter.dateFormat = "yyyy/MM"
    let date = dateformatter.date(from: str)!

    dateformatter.dateFormat = "MMMM"
    return dateformatter.string(from: date)
}

结果是:

[
 ["month": "June", "steps": 2000], 
 ["month": "April", "steps": 4000], 
 ["month": "May", "steps": 4000]
]

关于swift - swift 总结每日日期中的相似月份对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50193067/

相关文章:

swift - 如何在swiftui中自定义导航栏

swift - 如何让文本标签显示在 UICollectionView header 中?

swift - 重用UITextField值来控制仪表的弧长

ios - 订阅到期日期

ios - UIDocumentPickerViewController - 隐藏位置按钮

ios - 如何更改 UISearchBar 的边框粗细?

ios - 将来自 API 的数组的数组信息显示为表格

ios - swift 中的整数在输出中一次产生一个 int

ios - TableViewRow 中的 Swift 3+ CABasicAnimation

ios - 如何使用 EventKit 删除某些/特定事件