我有一个由几个属性组成的Employee对象(Employee对象的数组)列表,我想获取一个包含month和hoursWorked的字典(类似于Java中的哈希映射)。我看了其他帖子,但只找到了一些示例,可以在其中使用map->.map(\.month)
而不是两个值来收集项之一
struct Employee {
var id: UUID
var name: String
var month: Date
var hoursWorked: Double
var ...
var ...
}
样本数据-Employee对象的数组:
{month: 2019-01, hoursWorked: 256, id:..., name...}
{month: 2019-02, hoursWorked: 200, id:..., name...}
{month: 2019-03, hoursWorked: 300, id:..., name...}
{month: 2019-04, hoursWorked: 150, id:..., name...}
{month: 2019-05, hoursWorked: 100, id:..., name...}
{month: 2019-06, hoursWorked: 220, id:..., name...}
.
.
.
预期结果:由月和时数组成的字典:
[2019-01: 256.0]
[2019-02: 200.0]
[2019-03: 300.0]
[2019-04: 150.0]
[2019-05: 100.0]
[2019-06: 220.0]
...
实现此目的的一种方法是遍历Employee数组,并将工作的月份和小时收集到Swift字典中(Swift字典中的Date:Double)(类似于Java中的哈希映射)。我想知道在Swift中是否有更好/更简单(也许更快)的方法来完成此任务。
谢谢!
您可以reduce(into:_:)
为此使用功能:
let dictionary = emplyees.reduce(into: [Date: Double]()) { (result, employee) in
result[employee.month, default: 0] += employee.hoursWorked
}
这将创建一个字典[Date: Double]
,该字典将月份作为关键,并将该月的总工作小时数作为值。
更新:要返回一个元组数组,您需要做一些额外的工作:
let dictionary = emplyees.reduce(into: [(month: Date, hours: Double)]()) { (result, employee) in
if let index = result.firstIndex(where: { $0.month == employee.month }) {
result[index].hours += employee.hoursWorked
} else {
result.append((month: employee.month, hours: employee.hoursWorked))
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句