我有一组心率。我只想得到最近5分钟的平均心率。(数组包含超过一小时的心率)。
class HeartRate
{
var hr = 0
var date : Date?
}
var arrHeartRate = [HeartRate]()
let minDate = Date().addingTimeInterval(-300) //get 5min before time
var avgHR = self.arrHeartRate.filter { (Item) -> Bool in
return Item.date! > minDate
}.reduce(0) { (res, item) -> Result<Any, <#Error: Error#>> in
return res
}发布于 2017-07-13 21:00:49
下面是一些代码,它是不同的stackoverflow答案的聚合。
class HeartRate
{
var hr = 0
var date: Date?
}
extension Collection where Iterator.Element == HeartRate, Index == Int {
/// Returns the average of all elements in the array
var average: Double {
return isEmpty ? 0 : Double(reduce(0) { $0 + $1.hr }) / Double(endIndex-startIndex)
}
}
var arrHeartRate = [HeartRate(), HeartRate()]
let minDate = Date().addingTimeInterval(-300) //get 5min before time
let rateInLast5Min = arrHeartRate.filter {
guard let date = $0.date else { return false }
return date > minDate
}
var avgHR = rateInLast5Min.average发布于 2017-07-13 20:51:37
您可以在两个步骤中进行过滤和缩减。首先,获取时间范围内的心率数组
let filtered = arrHeartRate.filter{$0.date ?? Date() > minDate}或者进行一些调整以从已过滤的数组中排除nil date
let filtered = arrHeartRate.filter{$0.date ?? Date().addingTimeInterval(-500) > minDate}然后计算平均值和收益率
return Double(filtered.reduce(0){$0 + $1.hr}) / Double(filtered.count)发布于 2017-07-13 20:39:31
我还没有运行它,但经过一些调整应该是您正在寻找的
let rateInLast5Min = arrHeartRate.filter({ 0$.date! > minDate })
let hours = rateInLast5Min.map{ return $0.hr }.reduce(0, +)
let average = Double(hours)/Double(rateInLast5Min.count)https://stackoverflow.com/questions/45080688
复制相似问题