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

时间:2015-04-03 08:55:21

标签: arrays json jq

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

[
  {
    "name": "first_source",
    "id": "abcdef"
  },
  {
    "name": "second_source",
    "id": "ghijkl"
  },
  {
    "name": "third_source",
    "id": "opqrst"
  }
]

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

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

jq '.[] | select (.name == "first_source") 

但我显然需要返回整个数组才能使我的场景发挥作用。

1 个答案:

答案 0 :(得分:5)

您可以使用此过滤器:

select(
    (map(.name == "first_source") | any) and
    (map(.name != "second_source") | all)
)

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

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