在Groovy中使用递归嵌套映射合并映射

我想知道是否有人可以轻松地将2个深嵌套地图合并在一起?

例如,我想得到:

[ "a" : "1", "animals" : ["cat" : "blue"] ] + [ "b" : 2, "animals" : ["dog" : "red"] ] == [ "a" : 1, "b" : 2, "animals" : [ "cat" : "blue", "dog" : "red"] ] 

有人有简单的解决方案吗?

您可以使用递归为Map编写一个:

 Map.metaClass.addNested = { Map rhs -> def lhs = delegate rhs.each { k, v -> lhs[k] = lhs[k] in Map ? lhs[k].addNested(v) : v } lhs } def map1 = [ "a" : "1", "animals" : ["cat" : "blue"] ] def map2 = [ "b" : 2, "animals" : ["dog" : "red"] ] assert map1.addNested( map2 ) == [ a: '1', animals: [cat: 'blue', dog: 'red'], b: 2 ] 

我有一个与@dmahapatro类似的解决方案,但是使用带有可变参数的方法:

 def m1 = [a: 1, animals: [cat: 'blue']] def m2 = [b: 2, animals: [dog: 'red']] Map merge(Map... maps) { Map result if (maps.length == 0) { result = [:] } else if (maps.length == 1) { result = maps[0] } else { result = [:] maps.each { map -> map.each { k, v -> result[k] = result[k] instanceof Map ? merge(result[k], v) : v } } } result } assert [:] == merge() assert m1 == merge(m1) assert [a:1, b:2, animals:[cat:'blue', dog:'red']] == merge(m1, m2) 

仅供参考,现在可以开箱即用,你可以使用’加’或’+’:

 def map1 = [p1:100, p2:200, p5: [a:"x"]] def map2 = [p2: 1, p3:300, p4:400, p5: [a:"y"]] def map3 = map1 + map2 def map4 = map1.plus(map2) assert map3 == [p1:100, p2:1, p5:[a:'y'], p3:300, p4:400] assert map3 == map4