使用 jq 有条件地将元素添加到 json 数组

Conditionally add element to json array using jq

我正在使用 jq 将字符串添加到 JSON 数组,效果很好,但我只想添加尚不存在的字符串。我已经尝试过 unique、has、not 等。我遗漏了一两块拼图。

这是我的起始 json 文件,foo.json:

{
  "widgets": [
    {
      "name": "foo",
      "properties": [
        "baz"
      ]
    },
    {
      "name": "bar"
    }
  ]
}

这是我构建的添加字符串的 jq 命令,即使它已经存在:

$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties |= .+ ["cat"]'

这是我尝试的最新版本。

$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties | has("cat") | not | .properties += ["cat"]'
jq: error: Cannot check whether array has a string key

正如他们所说,给猫剥皮的方法不止一种,但也许这会给你一些想法:

.widgets[]
| select(.name=="foo")
| select(.properties | index("cat") | not)
| .properties += ["cat"]

根据您的输入,结果是:

{
  "name": "foo",
  "properties": [
    "baz",
    "cat"
  ]
}

以下可能更接近您要查找的内容:

.widgets |= [ .[] | if .properties|index("cat")|not
                    then .properties += ["cat"]
                    else .
                    end]

有很多方法可以做到这一点。

假设数组的元素应该是唯一的,您的用例强烈暗示了这一点,您可以在添加后通过 unique 过滤器传递结果数组。

$ cat foo.json | jq '.widgets[] | select(.name=="foo").properties |= (.+ ["cat"] | unique)'