【问题标题】:jq conditional update an array elementjq 条件更新数组元素
【发布时间】:2018-09-04 16:55:33
【问题描述】:

我想根据同一个数组中另一个元素的值有条件地更新一个元素值。

比如我想找到name=="weather",把checked从“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"
  }
]

对于 name = "weather" 的同一对象,选中的元素将更新为 "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"
  }
]

【问题讨论】:

  • 我试过 jq 。 | jq '[.[].discoveredEntities[] | if (.name=="weather") then (.checked = "false") else 。结束]' ./test.json。但它只是返回它的一部分,更新后的 check = false 天气。 [ {“名称”:“天气”,“检查”:“假”,“checkedBeforeEdit”:假,“storeFieldsAsStrings”:假},{“名称”:“天气_2”,“检查”:真, "checkedBeforeEdit": false, "storeFieldsAsStrings": false } ]

标签: json if-statement edit jq


【解决方案1】:

对于这些类型的更新,如果你这样想的话会更容易可视化,先找到你要更新的项目,然后再更新它们。

 (.[].discoveredEntities[] | select(.name == "weather").checked) = false
#[ locate the items to update                         ]
#                                                      [ update them   ]

【讨论】:

    【解决方案2】:

    想通了。

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

    【讨论】:

    • 您不需要外部方括号[],在这种情况下,您将结果放入数组中。但是由于正文只是分配,因此将始终返回初始输入。您最终会更新原始输入,但在一个数组中。
    • 使用布尔值false而不是字符串"false"会更符合文档的其余部分。
    【解决方案3】:

    在这里使用map 会产生一个非常简单的解决方案:

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

    请注意,这里使用false 显然比"false" 更合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多