2014-03-05 85 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的答案更好。 –