Arrays 在数组列表中连接嵌套数组

Arrays 在数组列表中连接嵌套数组,arrays,groovy,Arrays,Groovy,我希望有一个具有唯一字段的项目数组列表,但也要有一组它们使用并可以覆盖的基本字段或默认字段 这样做(如下所示)几乎完成了我想要的一切——只需在所有列表项上循环,并与我的“默认”字段列表连接。因此,例如,如果未指定,字段2将设置为“2222222”,但如果已指定(如在第一项中),则会覆盖它。但我也希望嵌套数组(field4)不被完全覆盖,而是被追加。因此,在我的示例中,arrCombine中的项中的字段4不会用它们自己的字段覆盖[“defaultValue”],而是添加到它中,比如[“defaul

我希望有一个具有唯一字段的项目数组列表,但也要有一组它们使用并可以覆盖的基本字段或默认字段

这样做(如下所示)几乎完成了我想要的一切——只需在所有列表项上循环,并与我的“默认”字段列表连接。因此,例如,如果未指定,字段2将设置为
“2222222”
,但如果已指定(如在第一项中),则会覆盖它。但我也希望嵌套数组(field4)不被完全覆盖,而是被追加。因此,在我的示例中,arrCombine中的项中的字段4不会用它们自己的字段覆盖
[“defaultValue”]
,而是添加到它中,比如
[“defaultValue”、“一”、“四”]
[“defaultValue”、“一”、“二”]
。有没有Groovy主义/捷径可以做到这一点

def arrNewItems = [
        [
                "field1"                   : "zzzzz",
                "field2"                  : 'eeeeeee',
                "field3"                  : 'wwwwwwwwwwww',
                "field4"                  : ['one','four'],
        ],
        [
                "field1"                   : "zzzzz",
                "field3"                  : 'sldkjflskdjflksdjf',
                "field4"                  : ['one','two'],
        ],
]

arrCombine = arrNewItems.collect {item ->
        defaultData = [
                "field1"                  : "111111111111111",
                "field2"                  : "222222222222222",
                "field3"                  : "333333333333333",
                "field4"                  : ["defaultValue"],
                "field5"                  : "555555555555555",
        ]
        return item + defaultData
}
println arrCombine

我不会说这很漂亮,但下面的代码:

def a = [
  [
    "field1": "zzzzz",
    "field2": 'eeeeeee',
    "field3": 'wwwwwwwwwwww',
    "field4": ['one','four'],
  ],
  [
    "field1": "zzzzz",
    "field3": 'sldkjflskdjflksdjf',
    "field4": ['one','two'],
  ],
]

def b = [
  "field1": "111111111111111",
  "field2": "222222222222222",
  "field3": "333333333333333",
  "field4": ["defaultValue"],
  "field5": "555555555555555",
]

def c = a.collect { am ->
  am.collectEntries { k, av -> 
    def bv = b[k]
    if (av instanceof List && 
        bv instanceof List)   [k, av + bv] 
    else if (bv == null)      [k, av]
    else                      [k, bv]
  } + b.findAll { k, v -> !am[k] }
}

c.each { m -> 
  println "-----"
  m.each { k, v -> 
    println "$k -> $v"
  }
}
运行时,生成:

─➤ groovy solution.groovy
-----
field1 -> 111111111111111
field2 -> 222222222222222
field3 -> 333333333333333
field4 -> [one, four, defaultValue]
field5 -> 555555555555555
-----
field1 -> 111111111111111
field3 -> 333333333333333
field4 -> [one, two, defaultValue]
field2 -> 222222222222222
field5 -> 555555555555555
这个问题使我希望有一个groovy
map.plus(otherMap){k1,v1,k2,v2->…}
方法或类似的东西,即
map+map
构造的定制。没有这样的运气。这是我能做的最不难看的了

您还可以通过将代码从
bv instanceof List][k,av+bv]
更改为
bv instanceof List][k,bv+av]
来颠倒
bv instanceof List][k,bv+av]
的顺序