jq:只选择一个包含元素A但不包含元素B的数组

dus*_*ust 4 arrays json jq

我的数据是一系列JSON数组.每个数组都有一个或多个带有name和id键的元素:

[
  {
    "name": "first_source",
    "id": "abcdef"
  },
  {
    "name": "second_source",
    "id": "ghijkl"
  },
  {
    "name": "third_source",
    "id": "opqrst"
  }
]
Run Code Online (Sandbox Code Playgroud)

如何使用jq,我只选择包含带有"first source"作为名称值的元素的数组,但是不包含"second_source"作为任何元素的名称值?

这只返回一个元素以供进一步处理:

jq '.[] | select (.name == "first_source") 
Run Code Online (Sandbox Code Playgroud)

但我显然需要返回整个数组才能使我的方案正常工作.

Jef*_*ado 5

您可以使用此过滤器:

select(
    (map(.name == "first_source") | any) and
    (map(.name != "second_source") | all)
)
Run Code Online (Sandbox Code Playgroud)

您需要测试数组的所有元素是否存在名称.您可以通过将每个对象映射到您的条件并适当地使用anyall过滤来实现.

在这里,您想要查看是否有任何项目已命名"first_source"且所有项目都未命名"second_source".