Groovy中的映射分组

  • 本文关键字:映射 Groovy groovy
  • 更新时间 :
  • 英文 :


我想嵌套一个映射,其中按公共值分组,并将其余值显示为嵌套映射。例如,如果我有以下映射:

[  
[user:andy, name:Andrew, role:dev, roleDesc:Developer],  
[user:andy, name:Andrew, role:sup, roleDesc:Supervisor],
[user:pat, name:Patricia, role:man, roleDesc:Manager],
[user:pat, name:Patricia, role:sup, roleDesc:Supervisor] 
]

我想以这样的映射结束,稍后转换为JSON:

[
[user:andy, name:Andrew, roles:[[role:dev, roleDesc:Developer], [role:sup, roleDesc:Supervisor]]],
[user:pat, name:Patricia, roles:[[role:man, roleDesc:Manager], [role:sup, roleDesc:Supervisor]]]
]

我尝试使用groupBy和collect,但我最终得到这样的东西:

[
[user:andy, name:Andrew, roles:[[role:dev, role:sup], [roleDesc:Developer, roleDesc:Supervisor]]],
[user:pat, name:Patricia, roles:[[role:man, role:sup], [roleDesc:Manager, roleDesc:Supervisor]]]
]

谢谢

类似一行代码:

import groovy.json.JsonOutput
def data = [  
[user:'andy', name:'Andrew', role:'dev', roleDesc:'Developer'],  
[user:'andy', name:'Andrew', role:'sup', roleDesc:'Supervisor'],
[user:'pat', name:'Patricia', role:'man', roleDesc:'Manager'],
[user:'pat', name:'Patricia', role:'sup', roleDesc:'Supervisor']
]
def res = data.groupBy{ [ user:it.user, name:it.name ] }.collect{ group, values -> group + [ roles:values.collect{ [ role:it.role, roleDesc:it.roleDesc ] } ] }
JsonOutput.prettyPrint JsonOutput.toJson( res )

注意,JsonOutput在这里只用于美观的格式化。

上面的代码输出:

[
{
"user": "andy",
"name": "Andrew",
"roles": [
{
"role": "dev",
"roleDesc": "Developer"
},
{
"role": "sup",
"roleDesc": "Supervisor"
}
]
},
{
"user": "pat",
"name": "Patricia",
"roles": [
{
"role": "man",
"roleDesc": "Manager"
},
{
"role": "sup",
"roleDesc": "Supervisor"
}
]
}
]

最新更新