对数组字典的所有值(数组)进行排序

时间:2019-01-29 22:53:57

标签: arrays swift dictionary

我有一个数组字典,通过将数组按date分组来创建(数组的元素具有datetime属性,它们都是 Date 对象):

let groupedData = Dictionary(grouping: array, by: { $0.date })

现在,我希望字典中的每个数组都按time属性进行排序。你有什么建议?

1 个答案:

答案 0 :(得分:0)

如果要显示按日期将对象分组的数组以显示在表格视图的部分中,则您没有字典,您需要的是2D数组。您可以先对对象进行分组,然后再按日期对它们进行排序,然后可以使用collection的reduce(into :)方法,并检查last array last element date属性是否与当前元素date在同一天。基于此,您将把对象附加到结果的最后一个集合中,并使用该元素附加一个新数组:

struct Obj {
    let date: Date
}
extension Obj: CustomStringConvertible {
    var description: String { return "Obj(date: \(date.description(with: .current))" }
}

我创建了一个自定义初始化程序,以使其更易于生成一些日期对象进行测试:

extension Date {
    init?(year: Int, month: Int, day: Int, hour: Int) {
        guard let date = DateComponents(calendar: .current, year: year, month: month, day: day, hour: hour).date else { return nil }
        self.init(timeInterval: 0, since: date)
    }
}

let objs = [(2019, 1, 26, 6),
            (2019, 1, 26, 7),
            (2019, 1, 27, 10),
            (2019, 1, 27, 11),
            (2019, 1, 28, 13),
            (2019, 1, 28, 14),
            (2019, 1, 28, 15)]
            .compactMap(Date.init)
            .map(Obj.init)

let groupedData: [[Obj]] = objs.sorted{ $0.date < $1.date }
    .reduce(into: []) {
        if let date = $0.last?.last?.date,
            Calendar.current.isDate(date, inSameDayAs: $1.date) {
            $0[$0.index(before: $0.endIndex)].append($1)
        } else {
            $0.append([$1])
        }
}

groupedData.forEach {
    print($0)
}