jq: select 仅包含元素 A 但不包含元素 B 的数组
jq: select only an array which contains element A but not element B
我的数据是一系列 JSON 数组。每个数组都有一个或多个带有 name 和 id 键的元素:
[
{
"name": "first_source",
"id": "abcdef"
},
{
"name": "second_source",
"id": "ghijkl"
},
{
"name": "third_source",
"id": "opqrst"
}
]
我如何使用 jq select 仅包含一个元素的数组 "first source" 作为名称值,但不包含 "second_source" 作为名称值任何元素?
这只有 return 一个 元素 需要进一步处理:
jq '.[] | select (.name == "first_source")
但我显然需要 return 整个阵列才能使我的场景正常工作。
您可以使用这个过滤器:
select(
(map(.name == "first_source") | any) and
(map(.name != "second_source") | all)
)
您需要测试数组的所有元素是否存在名称。您可以通过将每个对象映射到您的条件并适当地使用 any
或 all
过滤器来做到这一点。
在这里,您想查看是否有任何项目被命名为 "first_source"
而所有项目都没有被命名为 "second_source"
。
我的数据是一系列 JSON 数组。每个数组都有一个或多个带有 name 和 id 键的元素:
[
{
"name": "first_source",
"id": "abcdef"
},
{
"name": "second_source",
"id": "ghijkl"
},
{
"name": "third_source",
"id": "opqrst"
}
]
我如何使用 jq select 仅包含一个元素的数组 "first source" 作为名称值,但不包含 "second_source" 作为名称值任何元素?
这只有 return 一个 元素 需要进一步处理:
jq '.[] | select (.name == "first_source")
但我显然需要 return 整个阵列才能使我的场景正常工作。
您可以使用这个过滤器:
select(
(map(.name == "first_source") | any) and
(map(.name != "second_source") | all)
)
您需要测试数组的所有元素是否存在名称。您可以通过将每个对象映射到您的条件并适当地使用 any
或 all
过滤器来做到这一点。
在这里,您想查看是否有任何项目被命名为 "first_source"
而所有项目都没有被命名为 "second_source"
。