在下面,我试图删除“ bar”数组中的两个对象之一,其中一个是“ v” == 2的对象:
{
"foo": {},
"bar": [
{
"v": 2
},
{
"v": 1
}
]
}
我只能先保留列表,然后删除匹配的对象:
.bar[] | select(.v ==2 | not)
返回:
{
"v": 1
}
有没有一种方法可以删除子对象以保留封闭的对象:
{
"foo": {},
"bar": [
{
"v": 1
}
]
}
答案 0 :(得分:1)
使用del
运算符删除所需的节点:
<file jq 'del(.bar[] | select(.v==2))'
答案 1 :(得分:1)
沿着给定尝试的界限,即:
.bar [] |选择(.v == 2 |不是)
您将使用|=
运算符,例如:
.bar |= map(select(.v ==2 | not))
或者简单地:
.bar |= map(select(.v != 2))
如果您只想删除第一个匹配项,则可以输入:
.bar |= (index({v:2}) as $i| .[:$i] + .[$i+1:])
或更强大:
.bar |= (index({v:2}) as $i
| if $i then .[:$i] + .[$i+1:] else . end)
或者,如果您愿意:
.bar |= ( ([.[].v]|index(2)) as $i
| if $i then del(.[$i]) else . end)