我有一个类似于以下内容的 JSON 数组( map 列表):
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)从上面的 map 列表中,我想获取键“METHOD”的所有唯一/不同值
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
map 列表中的唯一值列表
要从映射列表中为给定键选择值,您可以使用 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()
关于groovy - 从 JSON ARRAY(映射列表)中查找/过滤具有特定键值对的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48434901/