Arrays 如何使用reduce将数组转换为二维数组?
我有一个自定义模型数组:Arrays 如何使用reduce将数组转换为二维数组?,arrays,swift,reduce,Arrays,Swift,Reduce,我有一个自定义模型数组: struct Event { var day: Int // let's assume its Int for now var title: String } 作为: 我想将数组转换为二维数组,每个数组都应该包含具有相同日期的事件;根据数组,结果应为: [ [Event(day: 1, title: "Pizza Party!"), Event(day: 1, title: "Another Pizza Party")] [Event(
struct Event {
var day: Int // let's assume its Int for now
var title: String
}
作为:
我想将数组
转换为二维数组,每个数组都应该包含具有相同日期的事件;根据数组
,结果应为:
[
[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")]
]
第一个数组(在外部2d数组中)包含第1天的事件,第二个数组包含第2天的事件
有没有办法用这种方法得到上述结果
尽管我想使用reduce(into::)
实现它,但我还是能够通过实现:
func transfrom(_ models: [Event]) -> [[Event]] {
let uniqueDates = Set(array.map { $0.day }).sorted()
var twoDArray = [[Event]]()
for date in uniqueDates {
var array = [Event]()
for model in models {
if date == model.day {
array.append(model)
}
}
twoDArray.append(array)
}
return twoDArray
}
let transfomredArray = transfrom(array) // wanted result
您可以使用字典的分组功能来满足您的要求:
// This dictionary will have all your events grouped based on the day it belongs to.
let dict = Dictionary(grouping: array) { (element) -> Int in
return element.day
}
// If you need a sorted list of events based on the day.
let groupedItems = dict.sorted {
return $0.key < $1.key
}
// groupedItems would now have all the data, grouped and ready to be used.
for day in groupedItems {
print("\(day.key): \(day.value.count)")
}
//此词典将根据所属日期对所有事件进行分组。
让dict=Dictionary(分组:数组){(元素)->Int-in
返回元素。天
}
//如果您需要一个基于日期的事件排序列表。
让groupedItems=dict.sorted{
返回$0.key<$1.key
}
//groupedItems现在将所有数据分组并准备好使用。
在groupedItems中的一天{
打印(“\(day.key):\(day.value.count)”)
}
如果您仍然想要减少(到:)
:
let result:[[Event]]=array.sorted{$0.day<$1.day}
.reduce(减为:[[Event]]())
{节奏、事件
如果让lastArray=tempo.last{
如果lastary.first?.day==event.day{
let head:[[Event]]=数组(tempo.dropLast())
let tail:[[Event]]=[lastArray+[Event]]
节奏=头+尾
}
否则{
节奏追加([事件])
}
}否则{
节奏=[[事件]]
}
}
要以更简单的方式进行操作,您可以使用@MartinR的注释:
let resultArray = Dictionary(grouping: array, by: { $0.day }).values
但可能需要对其执行一些额外的操作,比如排序。然后,您可以使用以下方法:
根据day
参数对数据进行分组。结果将是[Int:[事件]]
let grouped = Dictionary(grouping: array, by: { $0.day })
let sorted = grouped.sorted(by: { $0.key < $1.key })
根据关键字对分组数据进行排序。结果将是[Int:[事件]]
let grouped = Dictionary(grouping: array, by: { $0.day })
let sorted = grouped.sorted(by: { $0.key < $1.key })
为什么减少(成::)
?类似于Array(Dictionary(grouping:Array,by:{$0.day})。values)
的东西应该可以解决这个问题。你为什么认为reduce(into:-:)
适合这个任务?我的意思是,这真的是一个要求吗?你不能使用reduce(into:)
reduce将数组中的所有元素缩减为一个值。D V使用字典(分组:)
的答案应该有效。相关(重复?)@duncac我不同意
let resultArray: [[Event]] = sorted.reduce([]) { $0 + [$1.value] }