满足子节点特定条件时修改父节点value值的jq实现
解决方案
通用版过滤器(基于input值判断)
以下是适配jq v1.5的通用过滤器,会检查目标父节点的sub数组是否满足两个核心条件:
- 所有
input为"Text"的子节点,value不为空字符串 - 所有
input为"ChecklistState"的子节点,value严格等于"OK"
满足条件时自动将父节点(id为"100")的value修改为"OK":
map( if (.sub | all(.input == "Text"; .value != "")) and (.sub | all(.input == "ChecklistState"; .value == "OK")) then .value = "OK" else . end )
按子节点ID检查的版本
如果需要精准指定子节点ID做判断,可使用以下过滤器:
map( if ( (.sub[] | select(.id == "110").value != "") and (.sub[] | select(.id == "120").value == "OK") and (.sub[] | select(.id == "130").value == "OK") and (.sub[] | select(.id == "140").value == "OK") ) then .value = "OK" else . end )
问题排查说明
你之前尝试的select(.sub[]?.id=="xxx").value写法,容易因为sub[]展开数组元素后返回多个值,导致条件判断逻辑不符合预期。改用all函数(通用版)或针对每个ID单独取值判断(ID版),就能避免这类问题。
验证结果
用你提供的JSON输入测试通用版过滤器,输出结果如下:
[ { "id": "100", "input": "ChecklistState", "value": "OK", "sub": [ { "id": "110", "input": "Text", "value": "foo", "sub": [] }, { "id": "120", "input": "ChecklistState", "value": "OK", "sub": [] }, { "id": "130", "input": "ChecklistState", "value": "OK", "sub": [] }, { "id": "140", "input": "ChecklistState", "value": "OK", "sub": [] } ] } ]
内容的提问来源于stack exchange,提问作者user12859400
相关产品推荐
相关产品推荐

