我有一个bean列表,我希望得到一个子列表,其中包含一个或多个属性的条件,其表达式如下所示:
${data[propertyName=='my value']}
data是一个bean列表,它有一个名为propertyName的属性。
这种方法可行吗?如果没有,那么最好的办法是什么。
非常感谢您的回答。 亨利
答案 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>