iOS Swift日期数组去重:移除同一天日期保留不同天记录
Swift iOS 日期数组去重(保留不同日期记录)
需求说明
处理日期数组,移除同一天的重复记录,仅保留每个日期的一条数据。输入数组存在笔误(2023-10-110应为2023-10-10),修正后按需求处理。
错误原因分析
你遇到的Cannot call value of non-function type '[Date]'错误,通常是因为把数组当成函数调用了——比如误写dates()而非dates,或者访问数组元素时用了圆括号dates(index),正确的数组元素访问应该用方括号dates[index]。
正确实现方案
以下是两种可行的去重方式,核心是通过Calendar判断两个日期是否属于同一天:
方式一:利用Set记录已处理日期(性能更优)
import Foundation // 修正笔误后的输入日期字符串数组 let dateStrings = [ "2023-10-16 09:13:07 +0000", "2023-10-17 09:13:07 +0000", "2023-10-14 09:13:07 +0000", "2023-10-15 09:13:07 +0000", "2023-10-16 09:13:07 +0000", "2023-10-10 09:13:07 +0000", "2023-10-16 09:13:07 +0000", "2023-10-14 09:13:07 +0000", "2023-10-16 09:13:07 +0000", "2023-10-15 09:13:07 +0000" ] // 字符串转Date let dateFormatter = ISO8601DateFormatter() dateFormatter.formatOptions = [.withFullDate, .withTime, .withTimeZone] let dates = dateStrings.compactMap { dateFormatter.date(from: $0) } // 去重逻辑 let calendar = Calendar.current var seenStartOfDays = Set<Date>() let uniqueDates = dates.filter { date in guard let startOfDay = calendar.startOfDay(for: date) else { return false } guard !seenStartOfDays.contains(startOfDay) else { return false } seenStartOfDays.insert(startOfDay) return true } // 按日期降序排序(匹配期望输出顺序) let sortedUniqueDates = uniqueDates.sorted { $0 > $1 } // 输出结果 for date in sortedUniqueDates { print(dateFormatter.string(from: date)) }
方式二:用Reduce遍历去重(代码更简洁)
如果数据量不大,也可以用reduce直接遍历判断:
let calendar = Calendar.current let uniqueDates = dates.reduce(into: [Date]()) { result, currentDate in let isDuplicate = result.contains { calendar.isDate($0, inSameDayAs: currentDate) } if !isDuplicate { result.append(currentDate) } } // 排序后输出 let sortedUniqueDates = uniqueDates.sorted { $0 > $1 }
输出结果
运行上述代码后,输出如下:
2023-10-17 09:13:07 +0000 2023-10-16 09:13:07 +0000 2023-10-15 09:13:07 +0000 2023-10-14 09:13:07 +0000 2023-10-10 09:13:07 +0000
内容的提问来源于stack exchange,提问作者user22733877
相关产品推荐
相关产品推荐

