代码之家  ›  专栏  ›  技术社区  ›  Sjakelien

从数组中删除具有重复日期属性的对象

  •  0
  • Sjakelien  · 技术社区  · 6 年前

    现在,我要确保没有具有相同“startPoint”的对象,不管其他属性的值如何。

    var uniqueValues = Set<String>()
    result = result.filter{ uniqueValues.insert("\($0.startPoint)").inserted}
    

    你们谁能给我指出正确的方向吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Ashley Mills    6 年前

    使用日期组件来设置唯一性,因此忽略时间部分

    struct Record {
        let date: Date
        let name: String
    }
    
    let now = Date()
    let soon = Date(timeIntervalSinceNow: 100) 
    let future = Calendar.current.date(byAdding: .day, value: 1, to: now)!
    let records = [Record(date: now, name: "Now"), 
                   Record(date: soon, name: "Soon"),  // same day so should be removed
                   Record(date: future, name: "Future")]
    
    
    var unique = Set<DateComponents>()
    let result = records.filter {
        let comps = Calendar.current.dateComponents([.day, .month, .year], from: $0.date)
        if unique.contains(comps) {
            return false
        }
        unique.insert(comps)
        return true
    }
    print(result)
    
    // [Record(date: 2018-10-11 13:47:17 +0000, name: "Now"),
    //  Record(date: 2018-10-12 13:47:17 +0000, name: "Future")]
    
        2
  •  -1
  •   dalton_c    6 年前

    我的方法与另一个答案类似,但由于使用了 Dictionary 而不是 Array Set 接近。

    struct MyObject {
      let startPoint: Date
    }
    
    let values: [MyObject] = [...]
    
    let unique = Array(
      values.reduce(into: [Date: MyObject]()) { result, value in
        result[value.startPoint] = result[value.startPoint] ?? value
      }.values
    )