Swift - 根据其子订单数组过滤对象数组?

Swift - Filtering an array of objects based upon its child array of orders?

我想根据 children 数组过滤 parent 机车数组;

即:找到所有locomotivesorders;仅当订单的枚举状态为“1”或“2”时;我正在使用功能代码来尝试过滤数组。

我有一系列机车

var locomotives = [Locomotive]

每个机车都有一个订单数组

class Locomotive {
    var order: [Order] = [Order]()
    var state: Int
}

订单是结构

enum OrderState: Int {
   case initial, existing, sold
}

struct Order {
 var state: OrderState = .initial
 var value: Int
}

我希望过滤数组 locomotives 并且仅 return 订单中 order.state 为 1 或 2 的机车。

但是我的功能代码 return 是 orders 的数组而不是 locomotives

的数组
let filter = locos
    .filter { (locomotive: Locomotive) -> Bool in
        return (locomotive.orders.count > 0)
    }
    .flatMap { (locomotive: Locomotive) -> [Order] in
        locomotive.orders
            .filter { (o: Order) -> Bool in
                return o.state == .existing || o.state == .sold
            }
    }

这个 return 是一个 [Order] 的数组,而不是预期的 [Locomotive]

的数组

我想知道如何让上面的功能代码给我一个机车列表:


进一步编辑:

我可以做一些修改,在我的机车中添加一个 lazy var class

class Locomotive {
    lazy var existingOrders: [Order] = {
        return self.orders.filter { (o: Order) -> Bool in
            return o.state == .existingOrder
        }
    }()
    lazy var completedOrders: [Order] = {
        return self.orders.filter { (o: Order) -> Bool in
            return o.state == .completedOrder
        }
    }()
// ...
}

然后在我的过滤器中我可以检查惰性变量

 let filter = locos
            .filter { (locomotive: Locomotive) -> Bool in
                return (
                    ((locomotive.existingOrders.count > 0) ||
                    (locomotive.completedOrders.count > 0))
                )
            }
// ....

但我会查看更好的方法。

您不应尝试映射到 Order,这就是您得到错误类型结果的原因。相反,您可以直接在机车上进行过滤,例如

locomotives.filter { ![=10=].order.isEmpty && [=10=].order.contains(where: { order in order.state > 0 }) }