首页 > 解决方案 > 在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]]

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

标签: swift

解决方案


    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]
]

推荐阅读