2017-04-11 130 views
3

filter方法是一個非常強大的工具,用於通過單個或多個條件進行過濾,但有沒有一種方法可以通過數組條件進行過濾?通過多個陣列條件過濾

class Car with properties: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 } 

我問題是我怎麼能過濾一個數組,如:

一個數組有例如兩種顏色blue和​​。我想用這些顏色過濾cars。我的觀點是得到n-conditions的公式。

+1

類似'cars.filter {arrayOfColors(contains:$ 0.color)}''? – Larme

+1

@Larme看起來像'cars.filter {arrayOfColors.contains($ 0.color)}' - 新的語法 – yerpy

+0

我沒有使用Swift,當我評論Swift時,它只是指出了可能的方法,代碼沒有保證可編譯,但可以理解。但是要感謝正確的(如果某人正在服用「本身」這個指示)。 – Larme

回答

12

暫時忘掉過濾器。想想看你會如何檢查汽車的顏色是否是數組中的一個值。

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) } 
+0

它不是我的。只要我可以接受答案(5分鐘)。 – yerpy

+0

我也沒有得到downvote,這是一個有效的解決方案......話雖如此,對'Set'而不是'Array'的成員測試在這裏可能更適合。 – Alladinian

+0

@Alladinian使用Set的好建議。 OP提到有一個數組。 – rmaddy

0

將過濾器關閉視爲值類型並將它們存儲在數組中。使用inner reduce調用創建一個單一的布爾值,當前汽車滿足所有條件。如果您需要複合測試,如顏色==「藍色」或「綠色」,那麼只需將其添加到過濾器關閉條件數組中即可。

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) } 
    } 
+0

減少方法並不好,因爲它不會執行任何短路 – Alexander