有条件地将元素追加到数组

Conditional append a element to an array

这是我的 jq,它只是想构建一个新元素,然后将其追加到数组中,

[.[] | . as { foo: $foo1,  bar: $bar1} |
    {
        names: ([
            $foo1 | range(0;length) as $i |
            { key: ($foo1[$i]) }
        ] + [{ key: $bar1 }])
    } |
    {
    values: .names,
    }
]

假设我有一个这样的 json,

{
  "foo":[
     "key1",
     "key2"
   ],
  "bar": "key3"

}

这将生成这样的 json 文件,

[
  {
    "values": [
      {
        "key": "key1"
      },
      {
        "key": "key2"
      },
      {
        "key": "key3"
      }
    ]
  }
]

但是只有当 $bar 不是空字符串时才应该附加元素,我可以这样做吗?

[.[] | . as { foo1: $foo1,  bar1: $bar1 if $bar != ""}
...

或附加时执行,

        names: ([
            $foo1 | range(0;length) as $i |
            { key: ($foo1[$i]) }
        ] + [{ key: $bar1 }] | if $bar != "")

在此先感谢您的帮助!

您可以使用 select 过滤掉这种情况

jq '[{values: (.foo + [.bar | select(. != "")]) | map({key:.})}]'

如果.bar == "key3",它打印

[
  {
    "values": [
      {
        "key": "key1"
      },
      {
        "key": "key2"
      },
      {
        "key": "key3"
      }
    ]
  }
]

如果.bar == "",它打印

[
  {
    "values": [
      {
        "key": "key1"
      },
      {
        "key": "key2"
      }
    ]
  }
]

如果.bar不存在,则打印

[
  {
    "values": [
      {
        "key": "key1"
      },
      {
        "key": "key2"
      },
      {
        "key": null
      }
    ]
  }
]

如果在后一种情况下您希望获得与 .bar == "" 相同的结果,则在过滤器中将 . != "" 更改为 values != "" 以仅考虑不是 [= 的值21=](或 strings != "" 仅考虑 (non-empty) 字符串并忽略任何其他类型)。