0

我是 Groovy 和 Grails 的新手。我认为这个问题可能有一个简单的答案,我只是不知道。

我有一个数据库表:

id | category | caption | image | link

我有一个查询,可让我为“类别”中的每个不同项目检索一行。

我试图返回一个地图,其中每一行都是一个由它的类别命名的数组。

例如,如果我选择行:

[{category='foo', caption='stuff', ...} {category='bar', caption='things', ...}]

我希望能够:

return [foo:foo, bar:bar]

在哪里:

foo = [caption='stuff', ...]
bar = [caption='things', ...]

谢谢你的帮助。

4

2 回答 2

2

您可以使用collectGroovy 转换您的列表,但是,结果取决于源数据。我无法从您的帖子中推断出您是否要返回每个类别或多个项目。

def ls = Category.list()
def newList = ls.collect {
    [(it.category):['caption':it.caption,'image':it.image,'link':it.link]]
}

将导致类似:

[
[栏:[标题:BarCaption-2,图像:BarImage-2,链接:BarLink-2]],
[栏:[标题:BarCaption-1,图像:BarImage-1,链接:BarLink-1]],
[栏:[标题:BarCaption-0,图像:BarImage-0,链接:BarLink-0]],
[foo:[标题:FooCaption-2,图像:FooImage-2,链接:FooLink-2]],
[foo: [标题:FooCaption-1,图片:FooImage-1,链接:FooLink-1]],
[foo:[标题:FooCaption-0,图片:FooImage-0,链接:FooLink-0]]
]

如果每个类别有多个项目,您可能希望返回每个类别的列表。

def  bars = newList.findAll { it.containsKey 'bar'  }
def  foos = newList.findAll { it.containsKey 'foo'  }

[foos:foos,bars:bars] 
于 2013-08-31T06:26:03.427 回答
0

如果我正确理解了您的问题(我认为您的意思是在您的地图中使用 ':' 而不是 '='),那么我认为以下方法会起作用。如果您不熟悉 Groovy,您可能会发现位于http://groovyconsole.appspot.com/的 Groovy Web 控制台很有用。您可以轻松地尝试代码片段,如下所示:

def listOfMaps = [[category:'foo', caption:'stuff', something:'else'], [category:'bar', caption:'things', another:'thing']]
def mapOfMaps = [:]

listOfMaps.each { mapOfMaps += [(it.remove('category')) : it] }

assert mapOfMaps == [foo:[caption:'stuff', something:'else'], bar:[caption:'things', another:'thing']]
于 2013-08-31T04:18:39.493 回答