Удалить объекты с повторяющимся свойством даты из массива - PullRequest
0 голосов
/ 11 октября 2018

У меня есть этот массив объектов.Каждый объект имеет, среди прочего, свойство «startPoint», которое является датой.

Теперь я хочу убедиться, что нет объектов с той же «startPoint», независимо от значений других свойств..

Итак, я нашел потенциальный подход, который работает для строк, но не для дат:

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

Может ли кто-нибудь из вас указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Используйте компоненты даты для уникального включения, поэтому вы игнорируете временную часть

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")]
0 голосов
/ 11 октября 2018

Мой подход аналогичен другому ответу, но немного более производительный, поскольку он использует 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
)
...