使用 ./jq 按值过滤

Filter by values using ./jq

给定尺码输入:

[
  {
    "stock": 1,
    "sales": 0,
    "sizes": [
      {
        "countries": ["at", "be", "ch", "cy", "de", "ee", "es", "fi", "gr", "ie", "lu", "lv", "nl", "pl", "pt", "se", "si", "sk"],
        "size": "EU 45,5"
      },
      {
        "countries": ["it"],
        "size": "EU 45,5"
      },
      {
        "countries": ["fr"],
        "size": "EU 45,5"
      },
      {
        "countries": ["gb"],
        "size": "EU 45,5"
      }
    ]
  }
]

我想获得相同的结构,但没有 countries 没有 "de"(德国)的结构,并删除完整的字段。预期是这样的:

[
  {
    "stock": 1,
    "sizes": [
      {
        "size": "EU 45,5"
      }
    ]
  }
]

我试过这个:

map(.sizes[] |= select(.countries | join(",") | contains("de"))) | map({ stock, sizes })

但是过滤器没有正常工作,抛出jq: error (at <stdin>:48): Cannot iterate over null (null)

尝试了 hasincontainsinside,但似乎没有任何效果。

另外,如何过滤出现的字段? map({ stock, sizes }) 个国家仍然存在。我可以做类似 map({ stock, sizes: { size } }) 的事情吗?

这是一个可以回答您的主要问题的单行代码——如果您看不到它是如何工作的,请尝试将其分解成单独的部分:

map( .sizes |= map( select(.countries | index("de") ) | del(.countries) ))

关于字段的选择,你可以像上面那样使用del/1,或者有时简单地使用{key1, key2}这样的表达式就可以了。还请考虑此函数和以下示例:

def query(queryobject):
  with_entries( select( .key as $key | queryobject | has( $key ) ));

示例:

$ jq -c -n '{"a": 1, "b": null, "c":3} | query( {a,b,d} )'
{"a":1,"b":null}