Как подобъект можно удалить из объекта json с помощью jq? - PullRequest
0 голосов
/ 26 сентября 2018

Далее я пытаюсь удалить один из двух объектов в массиве "bar", где "v" == 2:

{
  "foo": {},
  "bar": [
    {
      "v": 2
    },
    {
      "v": 1
    }
  ]
}

Я могу сначала только сохранитьсписок, затем удалите соответствующий объект:

.bar[] | select(.v ==2 | not)

возвращает:

{
  "v": 1
}

Есть ли способ удалить подобъект, чтобы сохранить вмещающий объект:

{
  "foo": {},
  "bar": [
    {
      "v": 1
    }
  ]
}

Ответы [ 2 ]

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

По ходу данной попытки, а именно:

.bar [] |выберите (.v == 2 | не)

, вы бы использовали оператор |=, например:

.bar |= map(select(.v ==2 | not))

Или просто:

 .bar |= map(select(.v != 2))

Если вы хотите удалить только первое совпадение, вы можете написать:

.bar |= (index({v:2}) as $i| .[:$i] + .[$i+1:])

или более надежно:

.bar |= (index({v:2}) as $i
  | if $i then .[:$i] + .[$i+1:] else . end)

или, если вы предпочитаете:

.bar |= ( ([.[].v]|index(2)) as $i
  | if $i then del(.[$i]) else . end)
0 голосов
/ 26 сентября 2018

Используйте оператор del для удаления нужного узла:

<file jq 'del(.bar[] | select(.v==2))'
...