15

I have a map exposed to my visualforce page and I want to loop over it and display key and value

controller:

public Map<String,String> myMap { get; set; }

//init myMap 

page:

 <apex:repeat value="{!myMap.keySet() }" var="fieldKey">
    key: {!fieldKey }
    value: {!myMap.get(fieldKey ) }
 </apex:repeat>

but it gives the error Error: Unknown function myMap.keySet. Check spelling

2 Answers 2

34

The Visualforce for this situation is this:

<apex:repeat value="{!myMap}" var="fieldKey">
    key: {!fieldKey }
    value: {!myMap[fieldKey]}
</apex:repeat>

because the map key is automatically used by the apex:repeat and square brackets are the expression language way of looking up a value in a map.

PS

Most of the time the lack of ordering of the map keys isn't a good thing; iterating over a separate controller property that contains a sorted list of the key values instead is a way to address that:

public List<String> orderedKeys {
    get {
        List<String> keys = new List<String>(myMap.keySet());
        keys.sort();
        return keys;
    }
}

PPS

See this answer for some examples of how the ordering of the keys is now more predictable.

2
1

It might be a lot simpler to create a List of wrapper classes and have the key/value in there.

public class MyWrapper
{
  public String key{get; private set;}
  public String value{get; private set;}

  public MyWrapper(String key, String value)
  {
    this.key = key;
    this.value = value;
  }
}

You can create the list of wrapper in your controller like:

myWrappers = new List<MyWrapper>();
for (String key: myMap.keySet())
{
  myWrappers.add(new MyWrapper(key, myMap.get(key));
}

You can then use repeat over this list you created.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.