Swift 将数组转换为分组字典

Swift 将数组转换为分组字典,swift,Swift,我有一个事务对象数组 var returnedArray: Array<Transaction> = [a, b, c, d] 其中,该日期的所有事务将位于以日期为键的数组中 我知道如何循环遍历数组中的每个元素并手动将其分配给正确的键,但我想知道是否有一个优雅的函数可以做到这一点。我在黑暗中键入此项,因为您在问题中没有提供太多细节。你需要即兴创作: // Get the list of distinct dates var dates = [NSDate]() for tran i

我有一个
事务
对象数组

var returnedArray: Array<Transaction> = [a, b, c, d]
其中,该日期的所有事务将位于以日期为键的数组中


我知道如何循环遍历数组中的每个元素并手动将其分配给正确的键,但我想知道是否有一个优雅的函数可以做到这一点。

我在黑暗中键入此项,因为您在问题中没有提供太多细节。你需要即兴创作:

// Get the list of distinct dates
var dates = [NSDate]()
for tran in returnedArray {
    if !dates.contains(tran.transactionDate) {
        dates.append(tran.transactionDate)
    }
}

// Now group according to date
var result = [NSDate : Array<Transaction>]()
for d in dates {
    let transactions = returnedArray.filter { $0.transactionDate == d } 
    result[d] = transactions
}
//获取不同日期的列表
变量日期=[NSDate]()
对于返回阵列中的tran{
if!dates.contains(事务处理日期){
日期。追加(事务处理日期)
}
}
//现在按日期分组
var result=[NSDate:Array]()
在日期方面{
let transactions=returnedArray.filter{$0.transactionDate==d}
结果[d]=交易记录
}
日期形成一组

var setOfDates = Set (returnedArray.map (transDate))
您可以从一系列对中创建字典:

var result = Dictionary (dictionaryLiteral: setOfDates.map { 
    (date:NSDate) in
  return (date, returnedArray.filter { date == $0.transDate })
}
您可以将其定义为数组扩展。比如:

extension Array {
  func splitBy<Key:Hashable> (keyMaker: (T) -> Key) -> Dictionary<Key, T> {
    let theSet = Set (self.map (keyMaker))
    return Dictionary (dictionaryLiteral: theSet.map { (key:Key) in 
       return (key, self.filter { key == keyMaker($0) })
    })
  }
}
扩展数组{
func splitBy(keyMaker:(T)->Key)->字典{
让theSet=Set(self.map(keyMaker))
返回字典(dictionaryTerral:theSet.map{(key:key)in)
返回(key,self.filter{key==keyMaker($0)})
})
}
}
extension Array {
  func splitBy<Key:Hashable> (keyMaker: (T) -> Key) -> Dictionary<Key, T> {
    let theSet = Set (self.map (keyMaker))
    return Dictionary (dictionaryLiteral: theSet.map { (key:Key) in 
       return (key, self.filter { key == keyMaker($0) })
    })
  }
}