过滤带表达式的bean列表

时间:2011-10-10 07:36:13

标签: freemarker

我有一个bean列表,我希望得到一个子列表,其中包含一个或多个属性的条件,其表达式如下所示:

${data[propertyName=='my value']}

data是一个bean列表,它有一个名为propertyName的属性。

这种方法可行吗?如果没有,那么最好的办法是什么。

非常感谢您的回答。 亨利

2 个答案:

答案 0 :(得分:12)

您可以编写一个FTL函数,该函数选择符合条件的列表项,并通过序列连接以新序列收集它们。您的过滤功能可以非常简单或非常复杂,具体取决于您的实际使用情况。以下是它可能如何工作的示例:

<#function filter things name value>
    <#local result = []>
    <#list things as thing>
        <#if thing[name] == value>
            <#local result = result + [thing]>
        </#if>
    </#list>
    <#return result>
</#function>

<#-- some test data -->
<#assign data = [ {"propertyName":"my value",    "foo":150},
                  {"propertyName":"other value", "foo":250},
                  {"propertyName":"my value",    "foo":120}] >

<#assign filteredData = filter(data, "propertyName", "my value") >

<#list filteredData as item>
    ${item.foo}
</#list>

但请注意,使用序列连接可能对您的表现来说是“次优的”。

答案 1 :(得分:1)

您可以通过创建自己的filter method variable并将其公开给模板来实现。然后,只需要使用要筛选的bean和属性值列表来调用它:

<#assign filteredData = filter(data, "my value") />
<#list filteredData as item>
    // do something fancy
</#list>