Найти / отфильтровать списки с определенной парой ключ-значение из массива JSON (список карт)
У меня есть массив 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) Из приведенного выше списка карт я хочу получить все уникальные / отличные значения для ключа "МЕТОД"
My output should return unique values of the key method : CLICK, TYPETEXT
1 ответ
фильтрация
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
получить мне значение для ключа METHOD
, На следующем шаге вы можете использовать Collection.unique()
Способ удаления всех дубликатов:
println listOfMap*.METHOD.unique()
// Output: [CLICK, TYPETEXT]
ВНИМАНИЕ: следующий метод не будет работать в скрипте Groovy для Jenkins pipe. В этом случае вам придется использовать Collection.collect(Closure closure)
в явном виде:
println listOfMap.collect { map -> map.METHOD }.unique()