Menu

Developers

Itereren over een Map in freemarker (in de juiste volgorde)

7 september 2011

Als je gebruik maakt van Freemarker kom je snel in een situatie waar je een loop door een Map heen wilt doen. Hoewel de handleiding van Freemarker daar geen specifiek voorbeeld voor geeft, maken ze wel duidelijk hoe je door een 'hash' heen kunt loopen:

<#assign h = {"name":"mouse", "price":50}>
<#assign keys = h?keys>
<#list keys as key>${key} = ${h[key]}; </#list>

Bovenstaand voorbeeld werkt ook op een Map, maar heeft als nadeel dat ?keys meer items bevat dan alleen de keys uit de map. Je krijgt namelijk ook de automatische properties en methoden van elk item. Om alleen de echte waarden te krijgen kun je checken of elk item een 'bijzonder' item is:

<#list items?keys as key>
  <#if items[key]?is_hash_ex && key != 'empty' && key != 'class'>
     <li>key: ${key} = ${items[key]}</li>
  </#if>
</#if>

Hoewel dit in principe werkt (maar ranzig), zul je merken dat de volgorde van de items niet meer hetzelfde is als de oorspronkelijke volgorde in de Map.

De juiste manier om door de key/value paren in de Map heen te loopen is door te itereren over de entrySet() van de Map. Dat is een methode die elke Map in java heeft en bevat een lijst met Map.Entry objecten. Elk van deze objecten heeft weer een key en een value. Hier zie je hoe je dat doet:

<#list items.entrySet() as entry>
  <li>key: ${entry.key} = ${entry.value}</li>
</#list>
blog comments powered by Disqus

Nieuwsbrief ontvangen?

Velden met een * zijn verplicht

Like ons op Facebook

Klik hieronder om ons te liken op Facebook.