Swift - 根据其子订单数组过滤对象数组?
Swift - Filtering an array of objects based upon its child array of orders?
我想根据 children
数组过滤 parent
机车数组;
即:找到所有locomotives
有orders
;仅当订单的枚举状态为“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]
的数组
我想知道如何让上面的功能代码给我一个机车列表:
- 有订单(其中 orders.count > 0)
- 根据
orders
的子数组过滤
进一步编辑:
我可以做一些修改,在我的机车中添加一个 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 }) }
我想根据 children
数组过滤 parent
机车数组;
即:找到所有locomotives
有orders
;仅当订单的枚举状态为“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]
我想知道如何让上面的功能代码给我一个机车列表:
- 有订单(其中 orders.count > 0)
- 根据
orders
的子数组过滤
进一步编辑:
我可以做一些修改,在我的机车中添加一个 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 }) }