JQ условное обновление элемента массива - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу условно обновить значение элемента на основе значения другого элемента в том же массиве.

Например, я хочу найти имя == "погода" и поменять отметку с "true" на "false"

[
  {
    "originalSourceId": null,
    "sourceConnection": {
      "id": null,
      "version": null,
      "properties": [
        {
          "id": null,
          "version": null
        }
      ],
      "name": "POSTGRESQL",
      "businessName": null
    },
    "checked": true,
    "newlyAdded": false,
    "discoveredEntities": [
      {
        "name": "weather",
        "checked": true,
        "checkedBeforeEdit": false,
        "storeFieldsAsStrings": false
      },
      {
        "name": "weather_2",
        "checked": true,
        "checkedBeforeEdit": false,
        "storeFieldsAsStrings": false
      }
    ],
    "defaultLevel": "MANAGED"
  }
]

проверенный элемент будет обновлен до "false" для того же объекта с именем = "погода"

[
  {
    "originalSourceId": null,
    "sourceConnection": {
      "id": null,
      "version": null,
      "properties": [
        {
          "id": null,
          "version": null
        }
      ],
      "name": "POSTGRESQL",
      "businessName": null
    },
    "checked": true,
    "newlyAdded": false,
    "discoveredEntities": [
      {
        "name": "weather",
        "checked": false,
        "checkedBeforeEdit": false,
        "storeFieldsAsStrings": false
      },
      {
        "name": "weather_2",
        "checked": true,
        "checkedBeforeEdit": false,
        "storeFieldsAsStrings": false
      }
    ],
    "defaultLevel": "MANAGED"
  }
]

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Для такого рода обновлений проще визуализировать, если вы думаете об этом таким образом, сначала найдите элементы, которые вы хотите обновить, а затем обновите их.

 (.[].discoveredEntities[] | select(.name == "weather").checked) = false
#[ locate the items to update                         ]
#                                                      [ update them   ]
0 голосов
/ 07 сентября 2018

Использование map здесь дает очень простое, но несколько пешеходное решение:

map( .discoveredEntities |=
        map(if .name == "weather" then .checked = false else . end))

Обратите внимание, что здесь, очевидно, более уместно использовать false, а не "false".

0 голосов
/ 04 сентября 2018

Разобрался.

jq '[.[].discoveredEntities[] |= if (.name=="weather") then (.checked = "false") else . end]'\
    ./test.json
...