2015-11-19 45 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