如何使用reduce(into:_ :)将数组转换为2d数组?

时间:2018-11-05 14:16:49

标签: arrays swift reduce

我有一组自定义模型:

struct Event {
    var day: Int // let's assume its Int for now
    var title: String
}

为:

let array = [Event(day: 1, title: "Pizza Party!"),
             Event(day: 1, title: "Another Pizza Party"),
             Event(day: 2, title: "Cinema - Moive 01"),
             Event(day: 2, title: "Cinema - Moive 02")]

我想将array转换为二维数组,每个数组应包含当天发生的事件;根据{{​​1}},结果应为:

array

第一个数组(在外部2d数组中)包含第[ [Event(day: 1, title: "Pizza Party!"), Event(day: 1, title: "Another Pizza Party")] [Event(day: 2, title: "Cinema - Moive 01"), Event(day: 2, title: "Cinema - Moive 02")] ] 天的事件,第二个数组包含1天的事件。

是否可以使用reduce(into:_:)方法获得以上结果?


尽管想使用2来实现,但我还是可以通过实现:

reduce(into:_:)

3 个答案:

答案 0 :(得分:3)

您可以使用词典分组功能来满足您的要求:

[-hm ]

答案 1 :(得分:0)

如果您仍然想要reduce(into:)

let result: [[Event]] = array.sorted { $0.day < $1.day }
    .reduce(into: [[Event]]())
    { tempo, event in
        if let lastArray = tempo.last {
            if lastArray.first?.day == event.day {
                let head: [[Event]] = Array(tempo.dropLast())
                let tail: [[Event]] = [lastArray + [event]]
                tempo = head + tail
            }
            else {
                tempo.append([event])
            }
        } else {
            tempo = [[event]]
        }
}

答案 2 :(得分:0)

要以更简单的方式进行操作,可以使用@MartinR的注释:

let resultArray = Dictionary(grouping: array, by: { $0.day }).values

但是您可能要对其执行一些额外的操作,可以说是排序。然后,您可以使用以下方法:

  1. 根据day参数对数据进行分组。结果将是[Int: [Event]]

    let grouped = Dictionary(grouping: array, by: { $0.day })
    
  2. 根据键对分组的数据进行排序。结果将是[Int: [Event]]

    let sorted = grouped.sorted(by: { $0.key < $1.key })
    
  3. 您可以使用reduce来获取所需格式的输出,请注意,简单地应用reduce会使数组变平,因此请使用{ $0 + [$1.value] }

    let resultArray: [[Event]] = sorted.reduce([]) { $0 + [$1.value] }