Как сгладить массив вложенных объектов в Swift?

#swift

#swift

Вопрос:

Я новичок в языке Swift, и я изо всех сил пытаюсь найти пример того, как сгладить / объединить массив вложенных объектов в один массив. Например. Используя JSON в качестве примера, я хочу преобразовать

 [
  { 
    name: 'Steve Maddon', 
    shoes: [
      { type: 'Jimmy Choo' }, 
      { type: 'Louix Crouton' }
    ] 
  },
  { 
    name: 'Bobby Brown', 
    shoes: [
      { type: 'Adidas' }, 
      { type: 'Reebok' }
    ] 
  },
]
  

Для

 [   
  {
    name: 'Steve Maddon',
    shoeType: 'Jimmy Choo'
  }, 
  {
    name: 'Steve Maddon',
    shoeType: 'Louix Crouton'
  },
  {
    name: 'Bobby Brown',
    shoeType: 'Adidas'
  },
  {
    name: 'Bobby Brown',
    shoeType: 'Reebok'
  }
]
  

Я смоделировал это, используя следующие классы и объекты:

 class Shoe { 
  let type: String

  init(type: String) {
    self.type = type
  }
}

class Person {
  let name: String
  let shoes: [Shoe]

  init(name: String, shoes: [Shoe]) {
    self.name = name
    self.shoes = shoes
  }
}

let people = [
  Person(name: "Steve Maddon", shoes: [
    Shoe(type: "Jimmy Choo"),
    Shoe(type: "Louix Crouton"),
  ]),
  Person(name: "Bobby Brown", shoes: [
    Shoe(type: "Adidas"),
    Shoe(type: "Reebok"),
  ])
]
  

И я хотел бы сгладить эти объекты в этой структуре данных:

 class PersonWithShoeType {
  let name: String
  let shoeType: String

  init(name: String, showType: String) {
    self.name = name
    self.shoeType = shoeType
  }
}
  

Я был уверен, что flatMap это та функция, которая мне нужна, но многие примеры работают только с простыми массивами. Как я могу этого добиться?

Комментарии:

1. Пожалуйста, не помечайте спам

Ответ №1:

Этого можно достичь с помощью следующего:

 class PersonWithShoeType {
  let name: String
  let shoeType: String

  init(name: String, showType: String) {
    self.name = name
    self.shoeType = shoeType
  }
}

let people = [
  Person(name: "Steve Maddon", shoes: [
    Shoe(type: "Jimmy Choo"),
    Shoe(type: "Louix Crouton"),
  ]),
  Person(name: "Bobby Brown", shoes: [
    Shoe(type: "Adidas"),
    Shoe(type: "Reebok"),
  ])
]

let personWithShoes = people.flatMap({ person in 
  person.shoes.map({ shoe in
    PersonWithShoeType(name: person.name, shoeType: shoe.type)
  }) 
})

  

Примечание для себя: сначала RTFM

Комментарии:

1. Что такое people here ? Вы даже не дали полного описания постановки задачи и не предоставили решение без соответствующих деталей.