【问题标题】:How to combine elements in an array?如何组合数组中的元素?
【发布时间】:2021-12-02 09:27:03
【问题描述】:

我正在尝试将“Project”对象的“role”参数与下面 myProjects 数组中的相同“id”和“title”参数组合:

struct Project: Identifiable {
    var id: String
    var title: String
    var role: String
}

var myProjects = [Project(id: "1", title: "Sunset", role: "2nd AD"),
                  Project(id: "2", title: "Lights", role: "Mix Tech"),
                  Project(id: "2", title: "Lights", role: "Sound Mixer"),
                  Project(id: "3", title: "Beach", role: "Producer")]
var updatedProjects: [Project] = []

// The goal is to update myProjects to show the following:
updatedProjects = [Project(id: "1", title: "Sunset", role: "2nd AD"),
                   Project(id: "2", title: "Lights", role: "Mix Tech & Sound Mixer"),
                   Project(id: "3", title: "Beach", role: "Producer"]

这是我迄今为止所尝试的,结果是我为 myProjects 数组中的每个项目提供了角色参数的重复组合。

var dupProjects = myProjects

for myProject in myProjects {
  for dupProject in dupProjects {
    if myProject.id == dupProject.id {
       let combinedRoles = "\(myProject.role) & \(dupProject.role)"
       updatedProjects.append(Project(id: myProject.id, 
                                      title: myProject.title, 
                                      role: combinedRoles))
    }
  }
}

print(updatedProjects) 
// [__lldb_expr_48.Project(id: "1", title: "Sunset", role: "2nd AD & 2nd AD"),
 __lldb_expr_48.Project(id: "2", title: "Lights", role: "Mix Tech & Mix Tech"),
 __lldb_expr_48.Project(id: "2", title: "Lights", role: "Mix Tech & Sound Mixer"),
 __lldb_expr_48.Project(id: "2", title: "Lights", role: "Sound Mixer & Mix Tech"),
 __lldb_expr_48.Project(id: "2", title: "Lights", role: "Sound Mixer & Sound Mixer"),
 __lldb_expr_48.Project(id: "3", title: "Beach", role: "Producer & Producer")]

【问题讨论】:

  • 顺序是否重要,或者您能保证ids 是按数字顺序排列的吗?如果titles 具有相同的id,它们是否也会被订购?如果id 相同但title 不同会怎样? (不可能的情况?)。请使用更多详细信息编辑您的问题
  • 顺序无关紧要,这里的id和title不可能不同。
  • 这里的主要目标是为具有相同“id”和“title”参数的“Project”对象组合角色参数。
  • 您是在说“假设我有两个数组,我想比较它们,并且通过比较,有一个数组是两者的组合,只有唯一值。基于 ID 和标题进行比较" ?
  • 好吧,从技术上讲,我有一个包含数据的数组,即“myProjects”数组。我想比较这个数组中的元素,并用“myProjects”数组中的组合唯一值填充“updatedProjects”数组。

标签: arrays swift for-loop


【解决方案1】:

您可以使用字典将它们按id 分组,组合角色,然后将组转换回单个Project

let combined = Dictionary(grouping: myProjects) { element in
    return element.id
}.compactMapValues { projects -> Project? in
    var first = projects.first
    first?.role = projects.map { $0.role }.joined(separator: " & ")
    return first
}.values.map { $0 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多