如何将对象附加到数组?

How to append a object to a array?

我有一个这样的输入 json 文件,

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

}

这里是jq过滤器的定义方式,

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

这将生成一个 json 文件,

<input.json jq  --slurp --from-file concat.jq > output.json
[
  {
    "values": [
      {
        "key": "key1"
      },
      {
        "key": "key2"
      }
    ]
  }
]

现在我想将 key3 附加到输出 json 并将过滤器定义为这样,

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

这好像不行,

<input.json jq  --slurp --from-file concat.jq > output.json

导致以下异常,

jq: error: syntax error, unexpected |=, expecting '}' (Unix shell quoting issues?) at <top-level>, line 4:
    }] |= .+ {key: $name},
jq: 1 compile error

我该如何解决这个问题?

使用 map 并直接构建对象不是更简单吗?

<input.json jq --slurp 'map({values: (.foo + [.bar] | map({key:.}))})'
[
  {
    "values": [
      {
        "key": "key1"
      },
      {
        "key": "key2"
      },
      {
        "key": "key3"
      }
    ]
  }
]

Demo

这能实现你想要的吗:

q --slurp '[
    .[] | . as { foo: $names,  bar: $name} |
    {
        names: ([
            $names | range(0;length) as $i |
            { key: ($names[$i]) }
        ] + [{ key: $name }])
    } |
    {
    values: .names,
    }
]' input.json