【问题标题】:Swift - Filtering an array of objects based upon its child array of orders?Swift - 根据其子订单数组过滤对象数组?
【发布时间】:2020-10-01 12:51:04
【问题描述】:

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

即:查找所有具有orderslocomotives;仅当订单的枚举状态为“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


【解决方案1】:

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

locomotives.filter { !$0.order.isEmpty && $0.order.contains(where: { order in order.state > 0 }) }

【讨论】:

  • 我试试看
  • 虽然我不得不把它改成$0.order$0.orders,但我还是让它能够满足我的要求;谢谢!接受。
猜你喜欢
  • 2021-03-21
  • 2020-12-14
  • 2013-10-08
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多