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

基于子数组值删除JSON数组元素:多条件筛选inner数组的JQ问题

解决方法:用jq过滤包含特定值且符合长度要求的inner数组

要实现你的需求,我们可以通过jq的map或del结合条件判断来筛选outer数组中的元素,核心是准确检查inner数组是否包含目标值(不考虑顺序),并结合长度条件进行过滤。

核心思路

我们需要保留outer中那些不满足删除条件的元素:

  • 删除条件:inner数组同时包含"val1"和"val2",并且长度等于2(对应你例子中被删除的项)。

具体实现命令

方法1:用map生成过滤后的数组(推荐,更直观)

.outer |= map(select(
  not (
    .inner | any(.value == "val1") 
    and any(.value == "val2") 
    and length == 2
  )
))

方法2:用del删除匹配的元素

del(.outer[] | select(
  .inner | any(.value == "val1") 
  and any(.value == "val2") 
  and length == 2
))

命令解释

  • .outer |= map(...):将outer数组替换为过滤后的新数组
  • select(not(...)):保留所有不满足括号内删除条件的元素
  • .inner | any(.value == "val1"):检查inner数组中是否存在value为"val1"的元素(不关心位置)
  • and any(.value == "val2"):同时检查是否存在value为"val2"的元素
  • and length == 2:额外添加长度条件,只有当inner数组长度恰好为2时才触发删除

测试示例

将你的原始JSON输入:

{ 
  "outer": [ 
    { "inner": [ { "value": "val1" }, { "value": "val3" } ] }, 
    { "inner": [ { "value": "val2" }, { "value": "val1" } ] }, 
    { "inner": [ { "value": "val2" }, { "value": "val1" }, { "value": "val3" } ] } 
  ] 
}

运行上述jq命令后,会得到你期望的结果:

{ 
  "outer": [ 
    { "inner": [ { "value": "val1" }, { "value": "val3" } ] }, 
    { "inner": [ { "value": "val2" }, { "value": "val1" }, { "value": "val3" } ] } 
  ] 
}

灵活调整条件

如果你需要修改长度要求(比如删除长度≥3的项),只需修改length == 2为length >=3;如果需要检查更多值(比如同时包含val1、val2、val3),可以继续添加and any(.value == "val3")即可。

内容的提问来源于stack exchange,提问作者user4918296

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:33:45