我有多层地图,就像从Json文件中读取的一样:
def someMap = parseJson( readFile(file:'someJson.json'))
/* below is the actual map from someJson.json
someMap = [gen:[type:all],
build:[time:6,
types:[
TypeA:[type1:[a:true, b:false, c:true, d:true, e:true],
type2:[a:true, b:false, c:true, d:true, e:true]],
TypeB:[type1:[a:true, b:false, c:true, d:true, e:true]
type2:[a:true, b:false, c:true, d:true, e:true]],
TypeC:[type1:[a:true, b:false, c:true, d:true, e:true],
type2:[a:true, b:false, c:true, d:true, e:true]]]]
*/
@NonCPS
def parseJson(txt){
def lazyMap = new groovy.json.JsonSlurper().parseText(txt)
def map = [:]
for ( prop in lazyMap ) {
map[prop.key] = prop.value
}
return map;
}
我想从地图中删除一些条目,例如“ TypeA”和“ TypeB”。但是使用Jenkins groovy脚本我无法做到,在常规的groovy中,我可以删除带有removeAll()或带有迭代器的条目,下面的事情已经尝试过了。
someMap.build.types.keySet().removeAll(['TypeA', 'TypeB', 'TypeC'].minus('TypeC')))
--------------
def iterator = someMap.build.types.entrySet().iterator()
while (iterator.hasNext()) {
if (iterator.next().key != 'TypeC' ) {
iterator.remove()
}
}
--------------
def lst=['TypeA','TypeB']
lst.each{
someMap.build.types.remove(it)
}
但是我得到的原始地图没有删除任何元素。
让我感到震惊的是,如果我手动构建相同的地图并尝试进行操作,它会很好地工作。
def mp2 = ['gen':['type':'all'],
'build':['types':[
'TypeA':['type1':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true'],
'type2':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true']],
'TypeB':['type1':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true'],
'type2':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true']],
'TypeC':['type1':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true'],
'type2':['a':'true', 'b':'false', 'c':'true', 'd':'true', 'e':'true']]]]]
def lst=['TypeA','TypeB']
lst.each{
mp2.build.types.remove(it)
}