4

我有一个 JSON 数组(地图列表),类似于:

def listOfMap = [[TESTCASE:1, METHOD:'CLICK', RESULT:'PASS'], 
      [TESTCASE:2, METHOD:'CLICK', RESULT:'FAIL'], 
      [TESTCASE:3, METHOD:'CLICK', RESULT:'FAIL'], 
      [TESTCASE:4, METHOD:'TYPETEXT', RESULT:'FAIL']]

1) 我想获取/过滤/返回所有包含键值对“ METHOD:CLICK ”和“ RESULT:FAIL ”的列表

My output should return 2 lists out of 4: [TESTCASE:2, METHOD:CLICK, RESULT:FAIL], [TESTCASE:3, METHOD:CLICK, RESULT:FAIL]

2)我想获得包含键值对“ METHOD:CLICK ”和“ RESULT:FAIL ”的列表计数

My output should be : 2 

3)从上面的地图列表中,我想获取键“ METHOD ”的所有唯一/不同值

My output should return unique values of the key method : CLICK, TYPETEXT
4

1 回答 1

7

过滤

Groovy 有一个称为Collection.findAll(Closure closure)过滤掉所有不满足谓词(表示为闭包)的值的方法:

println listOfMap.findAll { map -> map.METHOD == 'CLICK' && map.RESULT == 'FAIL' }

// Output: [[TESTCASE:2, METHOD:CLICK, RESULT:FAIL], [TESTCASE:3, METHOD:CLICK, RESULT:FAIL]]

数数

还有一种方法DefaultGroovyMethods.count(Iterable<T> self, Closure closure)需要一个谓词并计算有多少元素满足它:

println listOfMap.count { map -> map.METHOD == 'CLICK' && map.RESULT == 'FAIL' }

// Output: 2

地图列表中的唯一值列表

要从映射列表中为给定键选择值,您可以使用Groovy 的扩展运算符

println listOfMap*.METHOD // btw, listOfMap.METHOD will do the same

此代码转换为“为里面的每个元素listOfMap获取 key 的值METHOD。在下一步中,您可以使用Collection.unique()方法删除所有重复项:

println listOfMap*.METHOD.unique()

// Output: [CLICK, TYPETEXT]

警告:以下方法在 Jenkins 管道 Groovy 脚本中不起作用。在这种情况下,您必须Collection.collect(Closure closure)明确使用:

println listOfMap.collect { map -> map.METHOD }.unique()
于 2018-01-25T05:41:08.307 回答