首页 > 解决方案 > 如何在 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是我需要的函数,但许多示例仅在简单数组上运行。我怎样才能做到这一点?

标签: swift

解决方案


这可以使用以下方法来实现:

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优先


推荐阅读