2014-03-05 117 views
3

我想寫一個過濾多個條件數據的方法。這些標準應爲功能的過濾功能過去了,例如:Javascript:Concat布爾函數

var products = [/* some data */]; 
function filterMyProducts(criteria) { 
    return products.filter(/* I'm asking for this code */); 
} 

function cheap(product) { 
    return product.price < 100; 
} 

function red(product) { 
    return product.color == "red"; 
} 

// find products that are cheap and red 
var result = filterMyProducts([cheap, red]); 

我怎樣才能結合陣列過濾功能傳入的標準是什麼?我希望它們與布爾型相結合。

回答

5
function validateProduct(listOfFunctions) { 
    return function(currentProduct) { 
     return listOfFunctions.every(function(currentFunction) { 
      return currentFunction(currentProduct); 
     }); 
    } 
} 

function filterMyProducts(criteria) { 
    return products.filter(validateProduct(criteria)); 
} 

Working Demo

+1

+1偉大的答案。 – Andy

+0

如何將它們與布爾值**或**結合使用? – user2033412

+2

@ user2033412而不是'listOfFunctions.every',你必須使用'listOfFunctions.some'來獲得布爾型'OR'行爲:) – thefourtheye

1

可能是你可以在這裏使用reduce功能,這樣的事情:

function filterMyProducts(criteria) { 
    return criteria.reduce(function(prev, curr) { 
    return prev.filter(curr) 
    }, products) 
} 
+1

+1這真的很棒,但是OP也喜歡做布爾OR。 – thefourtheye

+0

由於每個過濾器調用會創建許多新的數組,因此這個版本不會更昂貴嗎? – user2033412

+0

是的,這可能是我想的。它對我來說更短,更「漂亮」。所以,如果你的陣列不是非常大,它是相當有用的。對於一般情況,@fourtheye的答案更好。 –