我有一组自定义模型:
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:_:)
答案 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
但是您可能要对其执行一些额外的操作,可以说是排序。然后,您可以使用以下方法:
根据day
参数对数据进行分组。结果将是[Int: [Event]]
let grouped = Dictionary(grouping: array, by: { $0.day })
根据键对分组的数据进行排序。结果将是[Int: [Event]]
let sorted = grouped.sorted(by: { $0.key < $1.key })
您可以使用reduce
来获取所需格式的输出,请注意,简单地应用reduce
会使数组变平,因此请使用{ $0 + [$1.value] }
。
let resultArray: [[Event]] = sorted.reduce([]) { $0 + [$1.value] }