I want to convert beforeDataSet to afterDataSet in Swift. Could you tell me how to convert it?
struct BeforeData {
var value: Int
var date: Date
}
struct AfterData {
var sumValue: Int
var dateString: String
}
let beforeDataSet = [
BeforeData(value: 100, date: date1), // 2022-01-01 12:00
BeforeData(value: 150, date: date2), // 2022-01-01 14:11
BeforeData(value: 120, date: date3), // 2022-01-02 07:00
BeforeData(value: 120, date: date4), // 2022-01-02 12:00
BeforeData(value: 200, date: date5), // 2022-01-03 08:00
]
let afterDataSet = [
AfterData(sumValue: 250, dateString: "2022/1/1"),
AfterData(sumValue: 240, dateString: "2022/1/2"),
AfterData(sumValue: 200, dateString: "2022/1/3"),
]
CodePudding user response:
What you need is to reduce your original array (considering their elements are sorted by date) and check if the last date is in the same day as the current element date. If true sum the element value with the last element value otherwise append a new element to the result with the current element value and the formatted date string:
let afterDataSet: [AfterData] = beforeDataSet.reduce(into: []) {
let dateString = Formatter.date.string(from: $1.date)
if let index = $0.indices.last,
$0[index].dateString == dateString {
$0[index].sumValue = $1.value
} else {
$0.append(.init(sumValue: $1.value, dateString: dateString))
}
}
You will need to add these Date Formatter to your project:
extension Formatter {
static let date: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = .init(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-M-d"
return formatter
}()
}
