2015-11-19 126 views
2

我在表格上方有4个复选框,用户可以使用该复选框从表格中过滤项目。通过javascript中的逻辑AND操作过滤多个属性

我目前使用Array.prototype.filter来筛选结果,但我确定其中的逻辑不正确。

我现在该过滤器基本上是:

// Note: a, b, c, and d are booleans representing the checked 
// state of each checkbox. They essentially map to a property on each 
// object in the array. 
arry.filter(function(i) { 
    if(a) return i.hasA; 
    if(b) return i.hasB; 
    if(c) return i.hasC; 
    if(d) return i.hasD; 
}); 

这里的结果不是我想要的东西。我想做类似的事情:

if(a && b && c && d) return i.hasA && i.hasB && i.hasC && i.hasD; 

但是,这样的排列会失去控制。本来就有一个更简单的方法来做到这一点。

任何想法?

+1

将被视为复选框或(包括满足任何的检查结果选项)或AND(包括符合所有选项的结果)? –

+0

“坚持以前的过滤器”是什么意思? –

+0

对不起,我试图让这个更清楚。复选框将被视为AND运算符。基本上,当所有4个选项都被选中时,过滤器应该只返回所有4个属性设置为true的项目。 – mariocatch

回答

3
arry.filter(function(i) { 
    return (!a || i.hasA) && 
     (!b || i.hasB) && 
     (!c || i.hasC) && 
     (!d || i.hasD); 
}); 

让我们来看看四个测试中的第一个。

如果未选中“A”(即a为false),则测试通过。或者,如果选中“A”(即a为真),则我们要求i.hasA对测试通过为真。

同样,无论是b没有被选中,或i必须有属性B.

...等

+0

这有效,但再次阅读它,它似乎在逻辑上不正确?例如...如果选中“a”,那么过滤器不会为该“item”返回“true”?它似乎会很快返回,甚至在检查属性hasA之前?它在应用程序中工作,所以我一定是错的,我只是不明白它。 – mariocatch

+0

答案已被编辑解释。我现在明白了。谢谢@ 200_success – mariocatch