如何用jq移除JSON对象数组中符合条件的元素并保留原对象?
解决jq移除数组元素并保留原对象的问题
我来帮你搞定这个jq的需求!你想要保留整个JSON对象结构,同时移除events数组中id为null的元素,对吧?
正确的jq命令
你可以通过更新.events字段,用map()来过滤数组元素,这样就能完美保留原对象的其他部分:
.events |= map(select(.id != null))
把这个命令用到你的示例输入上,就能得到你想要的输出:
输入:
{ "foo": "bar", "events": [ { "id": 1, "msg": "starting" }, { "id": 2, "msg": "working on it" }, { "id": null, "msg": "done" } ] }
执行命令后输出:
{ "foo": "bar", "events": [ { "id": 1, "msg": "starting" }, { "id": 2, "msg": "working on it" } ] }
为什么你之前的命令没成功?
- 第一个命令
select(.events[].id != null):这个是对整个对象做筛选,只有当所有events元素的id都不为null时才会保留原对象,它根本不会修改数组内容,自然不符合你的需求。 - 第二个命令
del(.events[], select(.id == null))):首先语法有问题,其次del(.events[])会尝试删除整个数组的元素,正确的删除逻辑应该是定位到数组里符合条件的元素再操作,但用map+select的方式其实更直观易懂。
结合你后续的需求(构建新对象)
你提到之后要取处理后的数组最后一个元素来构建新对象,直接把两个操作用管道连起来就行:
.events |= map(select(.id != null)) | {bar:.foo, event: .events[-1].msg}
执行后会得到:
{ "bar": "bar", "event": "working on it" }
内容的提问来源于stack exchange,提问作者mmlb
相关产品推荐
相关产品推荐

