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

时间:2018-10-11 13:00:09

标签: arrays swift duplicates

我有这个对象数组。每个对象都具有“ startPoint”属性,即“日期”。

现在,我想确保没有其他具有相同“ startPoint”的对象,而与其他属性的值无关。

因此,我发现了一种可能的方法,该方法适用于字符串,但不适用于日期:

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

你们当中有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

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

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")]

答案 1 :(得分:-1)

我的方法与其他答案类似,但是由于它使用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
)