配列から特定のプロパティの値が重複している要素を削除したい時があったので備忘録として残します。
実装
public extension Sequence where Element: Equatable {
func removeDuplicates<T: Hashable>(keyPath: KeyPath<Element, T>) -> [Element] {
var seen = Set<T>()
return filter { (element) -> Bool in
guard !seen.contains(element[keyPath: keyPath]) else {
return false
}
seen.insert(element[keyPath: keyPath])
return true
}
}
}
重複を削除したい対象のプロパティのKeyPath
を引数に指定できます。
使用方法
struct Person {
let id: Int
let name: String
}
let people = [
Person(id: 1, name: "John"),
Person(id: 2, name: "Doe"),
Person(id: 1, name: "John")
]
people
にはid
が重複している要素が含まれているので、これを削除してみます。
let uniquePeople = people.removeDuplicates(keyPath: \.id)
print(uniquePeople)
// 出力: [Person(id: 1, name: "John"), Person(id: 2, name: "Doe")]
このコードを実行すると、このようにid
プロパティが重複している要素が削除されます。