通过嵌套数组值的存在过滤 jq 中的对象

Ass*_*vie 9 jq

给定这样的文档:

[
  {
    "KVs" : [
      {
        "Key": "animal",
        "Value": "lion"
      },
      {
        "Key": "mascot",
        "Value": "lion"
      }
    ],
    "name": "roger"
  },
  {
    "KVs" : [
      {
        "Key": "animal",
        "Value": "zebra"
      },
      {
        "Key": "mascot",
        "Value": "lion"
      }
    ],
    "name": "linda"
  }
]
Run Code Online (Sandbox Code Playgroud)

我想jq只选择包含 KV 对的顶部数组的那些元素animal == "lion"

上述 JSON 文档的输出应为:

{
  "KVs" : [
    {
      "Key": "animal",
      "Value": "lion"
    },
    {
      "Key": "mascot",
      "Value": "lion"
    }
  ],
  "name": "roger"
}
Run Code Online (Sandbox Code Playgroud)

无法弄清楚如何使用select(). 我知道如何使用它根据一个特定字段进行选择。例如通过键名:.[] | select(.KVs[].Key == "animal"),对吗?但是我如何告诉它在两个字段(键和值)上匹配相同的 KV 对象?

Ass*_*vie 13

NM,在jqplay的帮助下和一些试验和错误解决了它。

这是解决方案: .[] | select(.KVs[] | .Key == "animal" and .Value == "lion")

( jqplay 永久链接)

  • 这里无关紧要,因为只有一个内部对象匹配,但通常您可能更喜欢使用 `any`。比较 `.[]|select(.KVs|any(.Value=="lion"))` 和 `.[]|select(.KVs[]|.Value=="lion")` (2认同)