Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何使用reduce将数组转换为二维数组?_Arrays_Swift_Reduce - Fatal编程技术网

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] }