有没有办法在Grails中将地图呈现为HTML表?

有没有办法在Grails中将地图呈现为HTML表?,grails,Grails,我想知道是否有一种很好的方法可以将映射到.gsp页面中的HTML表 示例地图: def map = ['Mammals':['Unicorn','Chimpanzee','Goat'], 'Reptiles':['Snake','Turtle']]; 这将导致如下情况: <table> <thead> <tr> <th>Mammals</th> <th&g

我想知道是否有一种很好的方法可以将
映射到
.gsp
页面中的HTML表

示例
地图

def map = ['Mammals':['Unicorn','Chimpanzee','Goat'],
                   'Reptiles':['Snake','Turtle']];
这将导致如下情况:

<table>
  <thead>
    <tr>
      <th>Mammals</th>
      <th>Reptiles</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Unicorn</td>
      <td>Snake</td>
    </tr>
    <tr>
      <td>Chimpanzee</td>
      <td>Turtle</td>
    </tr>
   <tr>
      <td>Goat</td>
      <td></td>
    </tr>
  </tbody>
</table>

哺乳动物
爬行动物
独角兽
蛇
黑猩猩
乌龟
山羊
理想情况下,我可以创建自己的自定义标记,因此我可以这样做:

<stackOverflow:tablizer map="${map}" />

类似的东西-可能是更好的方法,但这是我首先想到的

def mapToTable = { attrs ->

StringBuilder output = new StringBuilder()

if ( attrs.map instanceof Map )
{ 
    Map map = attrs.map

    if ( map.size() > 0 )
    {
        output.append("<table><thead><tr>")

        ArrayList[] values = map.values()

        int max = values.collect{it.size()}.max()


        map.each { key, val ->
            output.append("<th>${key}</th>")
        }

        output.append("</tr></thead><tbody>")

        (1..max).each { num ->
            output.append("<tr>")

            values.each {

                if ( it.size() >= num  )
                {
                    output.append("<td>${it.get(num-1)}</td>")    
                }
                else
                {
                    output.append("<td></td>")   
                }
            }    

            output.append("</tr>")
        }

        output.append("</tbody></table>")
    }

}
out << output
}
def mapToTable={attrs->
StringBuilder输出=新的StringBuilder()
if(attrs.map instanceof map)
{ 
Map Map=attrs.Map
如果(map.size()>0)
{
output.append(“”)
ArrayList[]values=map.values()
int max=values.collect{it.size()}.max()
map.each{key,val->
output.append(“${key}”)
}
output.append(“”)
(1..max).每个{num->
output.append(“”)
价值观{
if(it.size()>=num)
{
output.append(“${it.get(num-1)}”)
}
其他的
{
output.append(“”)
}
}    
output.append(“”)
}
output.append(“”)
}
}

out我不能对@James Kleeh的答案发表评论,但我修改了他的代码以打印一个映射列表,比如从Groovy Sql结果中得到的结果:

protected String mapToTable(List<Map> list) {

    StringBuilder output = new StringBuilder()

    Map first = list.first()

    output.append("<table><thead><tr>")

    first.each { key, val ->
        output.append("<th>${key}</th>")
    }

    output.append("</tr></thead><tbody>")

    list.each { map ->
        if (map.size() > 0) {

            def values = map.values()

            output.append("<tr>")

            values.each {
                output.append "<td>${it}</td>"
            }

            output.append("</tr>")
        }
    }
    output.append("</tbody></table>")

    output.toString()
}
受保护的字符串映射表(列表){
StringBuilder输出=新的StringBuilder()
Map first=list.first()
output.append(“”)
first.each{key,val->
output.append(“${key}”)
}
output.append(“”)
list.each{map->
如果(map.size()>0){
def values=map.values()
output.append(“”)
价值观{
output.append“${it}”
}
output.append(“”)
}
}
output.append(“”)
output.toString()
}

您必须创建自己的标记。这应该没那么难。@JamesKleeh right-o!我正在寻找有关impl的帮助。地图必须具有唯一的键。顺便说一句。这是无效的。抱歉,我修复了它。