Dan V
Dan V

Reputation: 23

Map grouping in Groovy

I would like to nest a map where I group by common values and show the remaining values as a nested map. For example, if I have the following map:

[  
[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] 
]

I would like to end with a map like this, to later convert to 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]]]
]

I tried to use groupBy and collect, but I end up with something like this:

[
[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]]]
]

Thank you

Upvotes: 2

Views: 85

Answers (1)

injecteer
injecteer

Reputation: 20699

Something like the one-liner:

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 )

Note, that JsonOutput is only for pretty formatting here.

The code above prints:

[
    {
        "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"
            }
        ]
    }
]

Upvotes: 2

Related Questions