【发布时间】:2020-10-01 12:51:04
【问题描述】:
我想根据 children 数组过滤 parent 机车数组;
即:查找所有具有orders 的locomotives;仅当订单的枚举状态为“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 过滤数组,并仅返回那些订单具有order.state 1 或2 的机车。
但是我的功能代码返回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
}
}
这将返回一个 [Order] 数组,而不是预期的 [Locomotive] 数组
我想知道如何使上述功能代码给我一个机车列表:
- 有订单(orders.count > 0)
- 根据
orders的子数组过滤它
进一步编辑:
我能够做一些小技巧,在我的机车类中添加 lazy var
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))
)
}
// ....
但我会回顾一下更好的方法。
【问题讨论】:
-
这无关紧要,但
var state: Int // State can be 0, 1 or 2不是好的 Swift。如果某个东西只能有三个离散值,那么它应该是一个枚举。 -
这是我实际程序中的一个枚举;我只是在这个问题中使用整数来减少冗长。我现在已经添加了。
标签: arrays swift functional-programming filtering flatmap