Как объединить элементы в массив?

#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 }