按多个数组条件过滤

时间:2017-04-11 14:06:33

标签: swift

filter方法是一个非常强大的工具,可以按单个或多个条件进行过滤,但有没有办法根据数组的条件进行过滤?

Car,其属性为:modelcolorengineStatus

  • cars是一个车辆很少的数组

一个条件看起来像:

let currModel = `Opel`

let filterdObject = cars.filter { $0.model == currModel }

两个或两个以上的条件如下:

let currModel = `Opel`
let currColor = `Green`

let filterdObject = cars.filter { $0.model == currModel || $0.color == currColor }

我的问题是我怎样才能按照以下数组进行过滤:

数组具有例如两种颜色bluegreen。我想按这些颜色过滤cars。我的观点是得到n-conditions的公式。

2 个答案:

答案 0 :(得分:24)

暂时忘掉过滤器。想一想如何检查汽车的颜色是否为数组中的值。

let colors = [ "Green", "Blue" ]
// or let colors: Set = [ "Green", "Blue" ]
if colors.contains(someCar.color) {
}

足够简单。现在在过滤器中使用相同的简单表达式。

let filterdObject = cars.filter { $0.model == currModel || colors.contains($0.color) }

答案 1 :(得分:5)

将过滤器闭包视为值类型并将其存储在数组中。使用内部reduce调用创建一个布尔值,该值为true,即当前汽车满足所有条件。如果您需要复合测试,如color ==" blue"或"绿色"然后只需将其添加到过滤器闭包条件数组中。

    struct Car {
      let model: String
      let color: String
    }

    let conditions: [(Car) -> Bool] = [
      {$0.model == "Opel"},
      {$0.color == "Red"},
    ]

    let carLot = [
      Car(model: "Opel", color: "Green"),
      Car(model: "Mustang", color: "Gold"),
      Car(model: "Opel", color: "Red"),
    ]

    let allRedOpels = carLot.filter {
      car in
      conditions.reduce(true) { $0 && $1(car) }
   }