JQ: Как заменить элемент в массиве или добавить его, если он не существует - PullRequest
0 голосов
/ 04 октября 2019

Учитывая следующую структуру json:

{
   "elements": [
      {
         "name": "disregard",
         "value": "me"
      },
      {
         "name": "foo",
         "value": "bar"
      },
      {
         "name": "dont-edit",
         "value": "me"
      }
   ]
}

Каким будет соответствующий запрос jq для замены value элемента name: foo или создания / добавления элемента в массив, еслиэто еще не существует?

1 Ответ

2 голосов
/ 04 октября 2019

Вот безопасное решение для пешеходов:

.elements 
|=  (map(.name) | index("foo")) as $ix
    | if $ix 
      then .[$ix]["value"] = "BAR" 
      else . + [{name: "foo", value: "BAR"}]
      end

Вы можете абстрагироваться от "foo" и "BAR" битов:

upsert

# Input is assumed to be an array of {name:_, value:_} objects
def upsert($foo; $bar):
  (map(.name) | index($foo)) as $ix
  | if $ix then .[$ix]["value"] = $bar else . + [{name: $foo, value: $bar}] end;

Использование:

.elements |= upsert("foo"; "BAR")
...