基于子数组值删除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
相关产品推荐
相关产品推荐

