#arrays #swift #for-loop
Вопрос:
Я пытаюсь объединить параметр «роль» для объектов «Проект» с теми же параметрами «идентификатор» и «название» в массиве myProjects ниже:
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 amp; 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) amp; (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 amp; 2nd AD"), __lldb_expr_48.Project(id: "2", title: "Lights", role: "Mix Tech amp; Mix Tech"), __lldb_expr_48.Project(id: "2", title: "Lights", role: "Mix Tech amp; Sound Mixer"), __lldb_expr_48.Project(id: "2", title: "Lights", role: "Sound Mixer amp; Mix Tech"), __lldb_expr_48.Project(id: "2", title: "Lights", role: "Sound Mixer amp; Sound Mixer"), __lldb_expr_48.Project(id: "3", title: "Beach", role: "Producer amp; Producer")]
Комментарии:
1. Имеет ли значение порядок или вы можете гарантировать, что
id
буквы s находятся в числовом порядке? Возможноtitle
, s также упорядочены, если у них то жеid
самое ? Что произойдет, еслиid
то же самое, ноtitle
другое? (невозможный случай?). Пожалуйста, отредактируйте свой вопрос с более подробной информацией2. Порядок не имеет значения, и здесь невозможно, чтобы идентификатор и название отличались друг от друга.
3. Основная цель здесь-объединить параметр роли для объектов «Проект», которые имеют одинаковые параметры «идентификатор» и «название».
4. Вы говорите: «Предполагая, что у меня есть два массива, я хочу сравнить их, и из этого сравнения получится массив, представляющий собой комбинацию двух только с уникальными значениями. Сравнивается на основе идентификатора и названия» ?
5. Ну, технически у меня есть один массив с данными, массив «myProjects». Я хочу сравнить элементы в этом массиве и заполнить массив «Обновленные проекты» объединенными уникальными значениями из массива «myProjects».
Ответ №1:
Вы можете использовать словарь , чтобы сгруппировать их id
, объединить роли, а затем преобразовать группу обратно в одну Project
let combined = Dictionary(grouping: myProjects) { element in return element.id }.compactMapValues { projects -gt; Project? in var first = projects.first first?.role = projects.map { $0.role }.joined(separator: " amp; ") return first }.values.map { $0 }