如何从数组中提取重复对象并保留inUse为true的实例
Swift数组重复对象处理方案
1. 获取所有重复对象
先按name字段对数组分组,筛选出元素数量大于1的分组,展开这些分组的元素后按name排序,就能得到目标结果:
// 按name字段分组 let groupedByName = Dictionary(grouping: dogs) { $0.name } // 筛选重复分组并展开元素,最后按name排序 let duplicateDogs = groupedByName .filter { $0.value.count > 1 } .flatMap { $0.value } .sorted { $0.name < $1.name } // 打印名称验证结果 print(duplicateDogs.map { $0.name }.joined(separator: ", ")) // 输出:Teddy, Teddy, Browny, Browny
2. 保留inUse为true的对象,删除其余
基于分组结果,对每个重复分组筛选出inUse为true的对象,确保每个name只保留一个有效实例:
let filteredDogs = groupedByName .filter { $0.value.count > 1 } .compactMap { group in // 从分组中取出第一个inUse为true的对象 group.value.first { $0.inUse } } .sorted { $0.name < $1.name } // 打印名称验证结果 print(filteredDogs.map { $0.name }.joined(separator: ", ")) // 输出:Teddy, Browny
如果需要更直观的对象打印效果,可以给Dog模型补充自定义描述:
struct Dog: CustomStringConvertible { let name: String let inUse: Bool var description: String { "\(name)(\(inUse))" } }
内容的提问来源于stack exchange,提问作者fs_tigre
相关产品推荐
相关产品推荐

