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

标签 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") 

但我显然需要返回整个数组才能让我的场景工作。

最佳答案

您可以使用此过滤器:

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

您需要测试数组的所有元素是否存在名称。您可以通过将每个对象映射到您的条件并使用 any 来做到这一点。或 all适当过滤。

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

关于arrays - jq:只选择一个包含元素 A 但不包含元素 B 的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29429107/

相关文章:

javascript - 如何制作一个具有一处差异的数组副本?

C指针字符数组到字符数组

java - 通过 JSON 的多部分请求没有得到响应?

javascript - HighStock 图表中纪元日期时间未正确显示

json - 如何将 jq 中的参数传递给 ~/.jq 点文件中定义的函数?

ios - Objective C 可变数组

javascript - 替换字符串中与单独数组中的单词匹配的单词

javascript - jQuery 查看键是否存在于整个 JSON 中

json - 我有一个凌乱的 JSON,我正在尝试使用 jq 清理它

docker - 从 docker inspect 获取标签值