首页 > 解决方案 > 如何从具有多个条件的数组中删除重复项?

问题描述

目标:我必须从具有相同标题、附近、坐标.纬度和坐标.经度的数组中删除对象

    class Place {
        var placeID: String?
        var title: String?
        var vicinity: String?
        var detailsUrl: String?
        var openingHours: OpeningHours?
        var position: [Double]

        var coordinate: CLLocationCoordinate2D {
          return CLLocationCoordinate2DMake(position.first ?? 0, position.last ?? 0)
    }

我尝试过的一种方法-

extension Array {
    func removingDuplicates <T: Hashable>(byKey key: (Element) -> T) -> [Element] {
        var result = [Element]()
        var seen = Set<T>()
        for value in self {
            if seen.insert(key(value)).inserted {
                result.append(value)
            }
        }
        return result
    }
}


let array = list.removingDuplicates(byKey: { "\($0.coordinate.latitude)" + "\($0.coordinate.longitude)" + ($0.title ?? " ") + ($0.vicinity ?? " ") })

但我真的不喜欢上述解决方案。最合适的处理方式是什么?

标签: iosarraysswiftsortinghash

解决方案


添加EquatablePlace班级

class Place: Equatable {
    static func == (lhs: Place, rhs: Place) -> Bool {
        return lhs.title == rhs.title && lhs.vicinity == rhs.vicinity &&
            lhs.coordinate.latitude == rhs.coordinate.latitude && lhs.coordinate.longitude == rhs.coordinate.longitude
    }
    //...        
}

并使用要删除的地点/地点过滤数组元素

var list = [Place]()
//Delete multiple places
let placesToDelete = [Place]()
let result = list.removeAll { placesToDelete.contains($0) }
//Delete one place
let placeToDelete = Place()
let result = list.removeAll { $0 == placeToDelete }

推荐阅读