You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:47:41