考虑到尺寸的输入:
[
{
"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)
。
尝试has
,in
,contains
,inside
,似乎没有任何效果。
另外,如何过滤哪个字段?仍有map({ stock, sizes })
个国家/地区。我可以做map({ stock, sizes: { size } })
之类的事情吗?
答案 0 :(得分:1)
这是一个回答你的主要问题的单行 - 如果你看不清楚它是如何工作的,试着把它分成不同的部分:
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}