Найти / отфильтровать списки с определенной парой ключ-значение из массива 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()
Другие вопросы по тегам