如何遍历 json 数组并为更大的 json 填充中的每个项目找到匹配项?
How to loop through a json array and find a match for each item in bigger json fille?
例如,我有这个 json 文件:
[
{
"Name": "Bob",
"Grade": "Pass"
},
{
"Name": "Alice",
"Grade": "Fail"
},
{
"Name": "Mallory",
"Grade": "Fail"
}
]
而这个数组["Bo", "Al"]
我如何遍历数组以仅检查那些学生的 json 文件并输出他们的{姓名,成绩}?
另请注意,我可以做一系列 select(test(.Name == "Bob"))
的管道,但我不能对其进行硬编码,因为数组是根据选择动态生成的。
如果您需要进一步的许可,请告诉我。
谢谢!
注意:编辑询问如何为子字符串执行此操作,例如“Bob”和“Alice”的“Bo”和“Al”。抱歉,我对 jq 高级主题真的很陌生。再次感谢!
采用轻微修改评论中链接问题的答案以适应OP
的use-case
jq -n --argjson names '["Bob", "Alice"]' '
(reduce $names[] as $name ({}; .[$name] = true)) as $set
| inputs | map(select($set[.Name]))' json
reduce
函数基本上创建一个 hash-map 真值映射到输入名称数组的每个条目。稍后将贴图应用于每个输入对象。如果条件满足,打印想要的对象。
或者使用 any/2
函数
jq --argjson names '["Bob", "Alice"]' '
map(select( .Name as $a | any( $names[]; . == $a) ))' json
例如,我有这个 json 文件:
[
{
"Name": "Bob",
"Grade": "Pass"
},
{
"Name": "Alice",
"Grade": "Fail"
},
{
"Name": "Mallory",
"Grade": "Fail"
}
]
而这个数组["Bo", "Al"]
我如何遍历数组以仅检查那些学生的 json 文件并输出他们的{姓名,成绩}?
另请注意,我可以做一系列 select(test(.Name == "Bob"))
的管道,但我不能对其进行硬编码,因为数组是根据选择动态生成的。
如果您需要进一步的许可,请告诉我。
谢谢!
注意:编辑询问如何为子字符串执行此操作,例如“Bob”和“Alice”的“Bo”和“Al”。抱歉,我对 jq 高级主题真的很陌生。再次感谢!
采用轻微修改评论中链接问题的答案以适应OP
的use-casejq -n --argjson names '["Bob", "Alice"]' '
(reduce $names[] as $name ({}; .[$name] = true)) as $set
| inputs | map(select($set[.Name]))' json
reduce
函数基本上创建一个 hash-map 真值映射到输入名称数组的每个条目。稍后将贴图应用于每个输入对象。如果条件满足,打印想要的对象。
或者使用 any/2
函数
jq --argjson names '["Bob", "Alice"]' '
map(select( .Name as $a | any( $names[]; . == $a) ))' json