Swift中如何汇总对象数组内成员的总分?
问题描述
我有如下[UserModal]类型的数组:
var data: [UserModal] = [ UserModal(unit: "Unit 1", data: [ ScoreModal(name: "Ney", score: 10 ), ScoreModal(name: "Mes", score: 20 ), ScoreModal(name: "Ro", score: 30 ), ScoreModal(name: "Su", score: 40 ), ]), UserModal(unit: "Unit 2", data: [ ScoreModal(name: "Ney", score: 10 ), ScoreModal(name: "Mes", score: 20 ), ScoreModal(name: "Ro", score: 30 ), ScoreModal(name: "Su", score: 40 ), ]), UserModal(unit: "Unit 3", data: [ ScoreModal(name: "Ney", score: 10 ), ScoreModal(name: "Mes", score: 20 ), ScoreModal(name: "Ro", score: 30 ), ScoreModal(name: "Su", score: 40 ), ]), ]
希望计算各成员的总分,得到如下结果:
var result: [ScoreModal] = [ ScoreModal(name: "Ney", score: 30 ), ScoreModal(name: "Mes", score: 60 ), ScoreModal(name: "Ro", score: 90 ), ScoreModal(name: "Su", score: 120 ), ]
尝试用map操作未成功,求解决方案。
解决方案
map是一对一的转换操作,无法直接完成聚合求和的需求。你需要通过扁平化数组→分组→求和的步骤实现:
步骤说明
- 扁平化数组:将所有
UserModal中的data数组合并为一维数组 - 按姓名分组:以
name为键,将相同姓名的ScoreModal归类到同一组 - 计算总分:对每组的
score累加求和,生成新的ScoreModal实例
完整代码
// 先定义Modal结构(若未提前定义) struct ScoreModal { let name: String let score: Int } struct UserModal { let unit: String let data: [ScoreModal] } // 核心处理逻辑 let flattenedScores = data.flatMap { $0.data } let groupedByName = Dictionary(grouping: flattenedScores, by: { $0.name }) let result = groupedByName.map { name, scores in ScoreModal(name: name, score: scores.reduce(0) { $0 + $1.score }) }.sorted { $0.name < $1.name } // 可选:按姓名排序,确保结果顺序与示例一致
代码解释
flatMap:展开嵌套数组,把每个UserModal的data数组合并成一个包含所有ScoreModal的一维数组Dictionary(grouping:by:):将扁平化后的数组按name分组,得到[String: [ScoreModal]]类型的字典reduce:对每组内的score进行累加,计算出每个成员的总分sorted:可选操作,用于保证结果的姓名顺序和示例一致,无需特定顺序可省略
内容的提问来源于stack exchange,提问作者Effect
相关产品推荐
相关产品推荐

