按多个数组条件过滤

yer*_*rpy 8 swift

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

类Car与属性:model,color,engineStatus.

  • cars 是一个几乎没有汽车的阵列

一个条件看起来像:

let currModel = `Opel`

let filterdObject = cars.filter { $0.model == currModel }
Run Code Online (Sandbox Code Playgroud)

两个或多个条件看起来像:

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

let filterdObject = cars.filter { $0.model == currModel || $0.color == currColor }
Run Code Online (Sandbox Code Playgroud)

我的问题是我怎么能用数组过滤:

阵列具有例如两种颜色blue和green.我想cars用这些颜色过滤.我的意思是得到一个公式n-conditions.

rma*_*ddy 28

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

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

很简单.现在在过滤器中使用相同的简单表达式.

let filterdObject = cars.filter { $0.model == currModel || colors.contains($0.color) }
Run Code Online (Sandbox Code Playgroud)


Pri*_*ngo 6

将过滤器闭包视为值类型,并将它们存储在数组中。使用内部reduce调用创建一个布尔值,如果当前汽车满足所有条件,则该值为true。如果您需要像color ==“ blue”或“ green”这样的复合测试,只需将其添加到过滤器关闭条件数组中即可。

    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) }
   }
Run Code Online (Sandbox Code Playgroud)