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

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

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

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

Возвращает :

{
  "v": 1
}

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

{
  "foo": {},
  "bar": [
    {
      "v": 1
    }
  ]
}
1
user9038136 26 Сен 2018 в 10:54

2 ответа

Лучший ответ

По линиям данной попытки, а именно:

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

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

.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
peak 26 Сен 2018 в 10:40

Используйте оператор del, чтобы удалить нужный узел:

<file jq 'del(.bar[] | select(.v==2))'
0
oliv 26 Сен 2018 в 09:26