You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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是一对一的转换操作,无法直接完成聚合求和的需求。你需要通过扁平化数组→分组→求和的步骤实现:

步骤说明

  1. 扁平化数组:将所有UserModal中的data数组合并为一维数组
  2. 按姓名分组:以name为键,将相同姓名的ScoreModal归类到同一组
  3. 计算总分:对每组的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:27:45