Как перебрать массив json и найти совпадение для каждого элемента в большем файле json?

Например, у меня есть этот файл json:

[
  {
    "Name": "Bob",
    "Grade": "Pass"
  },
  { 
    "Name": "Alice",
    "Grade": "Fail"
  },
  {
    "Name": "Mallory",
    "Grade": "Fail"
  }
]

И этот массив ["Bo", "Al"]

Как выполнить цикл по массиву, чтобы проверить файл json только для этих учащихся и вывести их {Имя, оценка}?

Также примечание: я могу сделать серию каналов select(test(.Name == "Bob")), но я не могу жестко закодировать это, так как массив генерируется динамически в зависимости от выбора.

Дайте мне знать, если вам нужно дополнительное разрешение.

Благодарю вас!

Примечание. Отредактировано, чтобы спросить, как это сделать для подстрок, таких как Бо и Эл для Боба и Алисы. Извиняюсь, так как я действительно новичок в продвинутых темах jq. Еще раз спасибо!


person pnocti    schedule 09.11.2020    source источник
comment
Спасибо, что поймали этого @Inian! Да, на самом деле это всего лишь образец более сложного вывода. Я пробовал циклы foreach и if, но файл json фактически создается внутри скрипта конвейера jenkins.   -  person pnocti    schedule 09.11.2020
comment
Вам следует взглянуть на Выбор записей на основе нескольких значений в jq   -  person Inian    schedule 09.11.2020


Ответы (1)


Принятие ответа из связанного вопроса в комментариях с небольшой модификацией в соответствии с вариантом использования OP

jq -n --argjson names '["Bob", "Alice"]' '
(reduce $names[] as $name ({}; .[$name] = true)) as $set
    | inputs | map(select($set[.Name]))' json

Функция reduce в основном создает хэш-карту значений истинности, отображаемых для каждой записи вашего массива входных имен. Позже примените карту к каждому входному объекту. Если условие удовлетворяет, выведите нужный объект.

Или же используйте функцию any/2

jq --argjson names '["Bob", "Alice"]' '
 map(select( .Name as $a | any( $names[]; . == $a) ))' json
person Inian    schedule 09.11.2020
comment
Завтра проверю и обновлю спасибо - person pnocti; 09.11.2020
comment
@pnocti - решение с использованием $set, вероятно, будет гораздо более эффективным в вашем случае; в общем, это будет быстрее, если время, затрачиваемое на создание $set, не будет преобладать. - person peak; 10.11.2020