修改多个嵌套对象/数组中的键

时间:2018-10-01 09:50:19

标签: arrays json nested jq

我想修改json中所有x键的值,如下所示:

{
  "a": {
    "b": {
      "c": [
        {
          "0": {
            "x": 23,
            "name": "AS"
          }
        },
        {
          "1": {
            "x": 23,
            "name": "AS"
          }
        },
        {
          "2": {
            "x": 23,
            "name": "Fe"
          }
        },
        {
          "3": {
            "x": 23,
            "name": "Pl"
          }
        }
      ]
    }
  }
}

我尝试了多种方法,但是我无法修改x的值并因此无法获得完整的json。我要做的就是修改x的值并获得最后一个数组。

这是我最近一次达到结果的地方:https://jqplay.org/s/Wx741btZOg

2 个答案:

答案 0 :(得分:1)

要将所有x的值更改为97,可以尝试以下jq命令:

<file jq '.a.b.c as $in | .a.b.c=[ $in[] | .[].x=97 ]'

该命令将对象的父级存储在变量$in中,以便您可以修改其子元素之一。

答案 1 :(得分:1)

使用|=只需编写以下内容即可执行更新:

.a.b.c |= [.[]|.[].x=97]

或者也许更清楚:

.a.b.c |= map(.[].x=97)

如果您确实想“修改所有x键的值”,则可以使用walk

walk(if type == "object" and has("x") then .x=97 else . end)

(如果您的jq没有walk,那么您可以从网络上(例如,从stackblitz demo - template from中获取其定义)