我想看看谁能想出最好的Groovy-sh方法来实现这一点-
def m1 = [["id":"1","o":"11"],["id":"1","o":"12"],["id":"2","o":"21"]]
def m2 = [["o":"11","t":"t1"],["o":"11","t":"t2"],["o":"21","t":"t1"]]
I want result
[["id":"1","t":"t1"],["id":"1","t":"t2"],["id":"2","t":"t1"]]
我目前迭代的地图和这样做。我正在寻找使用Gpath和findAll的解决方案
谢谢,Sreehari .
您可以transpose
两个列表并从每个列表中获取条目(id
或t
):
def fn = { m1, m2 ->
return [m1,m2]
.transpose()
.collect { [ id: it.first().id, t: it.last().t ] }
}
def m1 = [["id":"1","o":"11"],["id":"1","o":"12"],["id":"2","o":"21"]]
def m2 = [["o":"11","t":"t1"],["o":"11","t":"t2"],["o":"21","t":"t1"]]
assert fn(m1, m2) ==
[["id":"1","t":"t1"],["id":"1","t":"t2"],["id":"2","t":"t1"]]
您可以使用转置将映射压缩成成对,然后组合成对并按映射键进行过滤:
[m1, m2]
.transpose()
.collect { (it[0] + it[1]).subMap(['id', 't']) }
求值为
[[id:1, t:t1], [id:1, t:t2], [id:2, t:t1]]