在 Groovy 中将映射与递归嵌套映射合并 [英] Merge maps with recursive nested maps in Groovy

查看:32
本文介绍了在 Groovy 中将映射与递归嵌套映射合并的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道是否有人有一种简单的方法可以将 2 个深度嵌套的地图合并在一起?

例如,我想得到:

<预><代码>["a" : "1",动物":[猫":蓝色"]] + [乙":2,动物":[狗":红色"]] == [一个":1,乙":2,动物" : [猫":蓝色",狗":红色"]]

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

解决方案

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

Map.metaClass.addNested = { Map rhs ->def lhs = 委托rhs.each { k, v ->地图中的 lhs[k] = lhs[k] ?lhs[k].addNested(v) : v }lhs}定义映射1 = ["a" : "1",动物":[猫":蓝色"]]定义地图2 = [乙":2,动物":[狗":红色"]]断言 map1.addNested( map2 ) == [一个:'1',动物:[猫:'蓝色',狗:'红色'],乙:2]

I would like to know if someone have an easy way to merge 2 deep nested maps together ?

For instance, I would like to get :

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

There is someone having easy solution ?

解决方案

You can write one for Map using recursion:

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
]

这篇关于在 Groovy 中将映射与递归嵌套映射合并的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆