Как обновить несколько объектов в массиве с помощью jq - PullRequest
0 голосов
/ 05 января 2019

Используя jq, я хотел бы условно обновить объекты в массиве "folders". Для каждого объекта, который содержит "cand_name":"folderA", должен быть добавлен новый атрибут "files" со значением compare.files

{
  "tmp":{
    "folders":[
      {
        "ref_name":"folderB",
        "cand_name":"folderA"
      },
      {
        "ref_name":"folderC",
        "cand_name":"folderA"
      },
      {
        "ref_name":"folderC",
        "cand_name":"folderE"
      }
    ],
    "compare":{
      "files":[
        {
          "candidate":"Z3S1"
        }
      ]
    }
  }
}

Для вышеуказанного ввода ожидаемый результат должен быть

{
  "tmp":{
    "folders":[
      {
        "ref_name":"folderB",
        "cand_name":"folderA"
        "files":[
          {
            "candidate":"Z3S1"
          }
        ]
      },
      {
        "ref_name":"folderC",
        "cand_name":"folderA"
        "files":[
          {
            "candidate":"Z3S1"
          }
        ]
      },
      {
        "ref_name":"folderC",
        "cand_name":"folderE"
      }
    ],
    "compare":{
      "files":[
        {
          "candidate":"Z3S1"
        }
      ]
    }
  }
 }

1 Ответ

0 голосов
/ 05 января 2019

Ключом к простому решению является |=. Используя ожидаемый результат в качестве руководства к намеченным требованиям, можно написать:

.tmp.compare.files as $f
| .tmp.folders 
  |= map( if .cand_name=="folderA" 
          then .files = $f else . end)
...