首页 > 解决方案 > jq:如何替换数组中的元素或如果它不存在则添加它

问题描述

给定以下 json 结构:

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

如果元素尚不存在,则jq替换元素或创建/添加元素到数组的适当查询value是什么?name: foo

标签: jsonjqupsert

解决方案


这是一个安全的行人解决方案:

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

您可能想抽象出"foo""BAR"位:

上插

# 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")

推荐阅读