如何遍历一个json数组并为更大的json填充中的每个项目找到一个匹配项?

问题描述

例如,我有这个json文件

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

这个数组["Bo","Al"]

我如何遍历数组以仅检查那些学生的json文件输出其{姓名,年级}?

另外请注意,我可以执行一系列select(test(.Name == "Bob"))的管道,但是由于根据选择动态生成数组,因此我无法对其进行硬编码。

让我知道您是否需要进一步的许可。

谢谢!

注意:编辑后询问如何对子字符串执行此操作,例如对于“鲍勃”和“爱丽丝”来说是“ Bo”和“ Al”。抱歉,对于jq高级主题我真的很陌生。再次谢谢你!

解决方法

在链接中的问题中采用对 slight 进行修改的注释,以适应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