当孩子满足特定条件时改变父母价值

问题描述 投票:0回答:1

我目前正在努力解决一些jq问题,希望有人能提供帮助。 给出的是以下 JSON 结构:

[
    {
        "id": "100",
        "input": "ChecklistState",
        "value": "-",
        "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": []
            }
        ]
    }
]

我需要一个过滤器,当输入类型“Text”的每个子项都没有空值并且每个输入类型“ChecklistState”的值都为“OK”时,该过滤器将父级(ID 100)的值更改为“OK”。 ( -> 110 不为空,120、130 和 140“OK”)

一个通用的过滤器(检查输入)会很棒,但我也不介意一个解决方案,我单独检查每个子ID。

我尝试过通过以下方式了解孩子们的价值观:

select(.sub[]?.id=="xxx").value
并将其连接到 if-then-else-end-Block 中,但结果是,条件似乎不起作用。

请注意:由于软件要求,我需要使用jq v1.5

json jq
1个回答
0
投票

这是在

.sub
数组上使用生成的索引对象的一种方法:

map(                                                          # process all items
  if
    .sub | map(.key = .id) | from_entries                     # create an index
    | [."110" != "OK", .["120","130","140"] == "OK"] | all    # match condition
  then
    .value = "OK"
  else
    .
  end
)
[
  {
    "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": []
      }
    ]
  }
]

演示

© www.soinside.com 2019 - 2024. All rights reserved.