给出这样的嵌套地图:
def map = [group: [group_name: 'test', group_color: 'red']]
有没有办法把它变成这个:
['group-group_name': 'test', 'group-group_color': 'red']
地图可以有任何级别的嵌套。
进一步说明:如果将地图视为树,我希望生成的地图将所有叶值作为其值,并且每个键应该是使用顶部的所有键构建的“绝对”键。叶节点的树(在上面的示例中,所有键都使用-
连接)。
这就是我想要的(当然不起作用):
def newMap = map.findAll { it.isLeaf() }.collect { [it.absoluteKeyPath: it.value] }
答案 0 :(得分:3)
我相信应该这样做:
def map = [ cheese: 'cheddar',
group: [ group_name: 'test',
group_color: 'red',
deep:[ bool:'yes' ] ] ]
def compress( Map m, String prefix = '' ) {
prefix = prefix ? "$prefix-" : ''
m.collectEntries { k, v ->
if( v instanceof Map ) compress( v, "$prefix$k" )
else [ ("$prefix$k".toString()): v ]
}
}
assert compress( map ) == [ 'cheese':'cheddar',
'group-group_name':'test',
'group-group_color':'red',
'group-deep-bool':'yes' ]
当然,您需要注意,因为地图密钥已经包含-
个字符,因此如果一个名称与叶子的路径相同,您可能会丢失数据