Dictionary iOS-swift 3-嵌套排序和与flatmap、map、filter或formUnion的联合

Dictionary iOS-swift 3-嵌套排序和与flatmap、map、filter或formUnion的联合,dictionary,filter,swift3,closures,flatmap,Dictionary,Filter,Swift3,Closures,Flatmap,问题1: 我想使用flatmap、filter、custom unique func或Sets.formUnion实现邻座贴图的并集。对于这个特殊的例子,它是 class Flight{ var name:String? var vocabulary:Vocabulary? } class Vocabulary{ var seatMapPlan:[Plan] = [] var foodPlan:[Plan] = [] } class Plan{ va

问题1: 我想使用flatmap、filter、custom unique func或Sets.formUnion实现邻座贴图的并集。对于这个特殊的例子,它是

class Flight{
    var name:String?
    var vocabulary:Vocabulary?
}


class Vocabulary{
    var seatMapPlan:[Plan] = []
    var foodPlan:[Plan] = []
}

class Plan{
    var planName:String?
    var planId:String?
}


var flightList:[Flight] = []
var plan1 = Plan()
plan1.planId = "planId1"
plan1.planName = "Planname1"

var plan2 = Plan()
plan2.planId = "planId2"
plan2.planName = "Planname2"

var plan3 = Plan()
plan3.planId = "planId3"
plan3.planName = "Planname3"

var plan4 = Plan()
plan4.planId = "planId4"
plan4.planName = "Planname4"

var plan5 = Plan()
plan5.planId = "planId5"
plan5.planName = "Planname5"

var plan6 = Plan()
plan6.planId = "planId6"
plan6.planName = "Planname6"

var flight1 = Flight()
flight1.name = "Flight1"
flight1.vocabulary = Vocabulary()
flight1.vocabulary?.seatMapPlan = [plan1, plan2]
flight1.vocabulary?.foodPlan = [plan3, plan4, plan5]


var flight2 = Flight()
flight2.name = "Flight2"
flight2.vocabulary = Vocabulary()
flight2.vocabulary?.seatMapPlan = [plan2, plan3]
flight2.vocabulary?.foodPlan = [plan3, plan4, plan5]

flightList=[flight1, flight2]
由于在回答问题的帮助下筑巢,我无法做到这一点。 请给我一个过滤器,平面图和地图的组合来解决这个特殊的问题

问题2: 如果我必须根据选择的计划(计划1或多个)对该阵列飞行列表进行排序,则我也会遇到相反的情况。我想根据过滤器和映射对其进行排序,但嵌套使其难以实现。 e、 g.1: 如果seatMapPlan的搜索参数为plan1。然后结果是flight1

e、 g.2:
如果seatMapPlan的搜索参数是plan2。然后结果是flight1,flight2。

对于第一个问题,我将使用集合。因此,首先制定
计划
实施
可散列

seatMapUnion = [plan1,plan2,plan3]
那么就很简单了:

class Plan : Hashable {
    var planName:String?
    var planId:String?

    public var hashValue: Int { return planName?.hashValue ?? 0 }
    public static func ==(lhs: Plan, rhs: Plan) -> Bool { return lhs.planId == rhs.planId }
}

我不确定我是否理解您的第二个问题。

var planArray=flightlList.flatMap{$0.词汇表!.seatMapPlan};var unionArray=Array(Set(planArray))帮个忙,添加带有参数的init方法。Gnasher729在实际环境中,它们是json解析的,高度嵌套的。这只是为了提问。
let set1 = Set<Plan>(flight1.vocabulary!.seatMapPlan)
let set2 = Set<Plan>(flight2.vocabulary!.seatMapPlan)

let union = set1.union(set2)
print(union.map { $0.planName! } )
["Planname2", "Planname1", "Planname3"]