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

满足子节点特定条件时修改父节点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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:53:18