Find/Filter 具有来自 JSON 数组(映射列表)的特定键值对的列表

Find/Filter the lists with a specific key-value pair from a JSON ARRAY (list of maps)

我有一个 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) 我想 get/filter/return 所有包含键值对“METHOD:CLICK”的列表和“结果:失败

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

2) 我想获得 count 个包含键值对“METHOD:CLICK”和“结果:失败"

My output should be : 2 

3) 从上面的地图列表中,我想获取键“METHOD[=32=”的所有 unique/distinct 值 ]

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

过滤

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's spread operator:

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

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

println listOfMap*.METHOD.unique()

// Output: [CLICK, TYPETEXT]

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

println listOfMap.collect { map -> map.METHOD }.unique()