2

我試圖在我的應用中實現過濾邏輯。有一個表格,每個列標題包含一個輸入字段和帶有過濾器選項的下拉列表,您可以通過選擇一個選項來設置過濾器。 「等於」,「不等於」,「以......開始」,「包含」,「不包含」,「以......結尾」等等(對於不同類型的數據,選項會改變)。類似KendoUI grid多謂詞過濾器,優雅的功能方法

現在什麼東西我可以不在身邊讓我的頭是如何創造條件,通過選擇過濾器的過濾謂詞的數據陣列功能(也可以設置多個過濾器)

我只是開始使用ramda.js,我認爲這個項目真的很棒。我想我可以用要麼或lodash /下劃線(我更喜歡ramda雖然)

如果有人能告訴我一個片段,東西 - 開始,我會很感激

回答

3

我認爲你正在尋找的R.allPass功能。你只是做

var selectedPredicates = …; 
R.filter(R.allPass(selectedPredicates))(list) 
+0

嗯,它看起來像我需要的東西。謝謝,我會嘗試 – Agzam 2014-09-29 05:57:13

+1

哇... ramda真棒!我創建了這樣的謂詞,如'R.curry(val,col,data) - > data [col] == val',並且在過濾器中使用了R.allPredicates,並且它工作得很好。感謝 – Agzam 2014-10-01 01:01:00

+0

這是否已經存在了?我找不到文檔 – jemiloii 2015-02-17 02:21:45

1

我並不完全清楚如果你的意思,我認爲你這樣做,所以這裏是我的假設:

  • 你有謂詞的列表在某種類型的t,那就是[t -> Bool]類型的東西,
  • ,你想擺脫即一個謂詞,它是tr如果列表中所有謂詞的連接符合其輸入。

然後,您可以使用帶有提升聯合操作符和常量基本情況(帶有空列表,「所有」謂詞平凡保持)的摺疊。這Haskell代碼的工作原理:

> let f = foldr (\f g -> \x -> f x && g x) (const True) [(>2), (<=10)] 
> f 5 
True 
> f 1 
False 

使用JS和ramda,f可能會莫名其妙地看像這樣(未經):

var f = R.reduce(function(f, g) { 
        return function(x) { return f(x) && g(x); }; 
       }, 
       alwaysTrue, 
       your_actual_predicates);