代码之家  ›  专栏  ›  技术社区  ›  jthill

jq:如何将包含命名布尔值的对象转换为`{“name”:“aname”,“enabled”:itsboolean}`的数组?

jq
  •  0
  • jthill  · 技术社区  · 3 年前

    我有一些描述插件状态的json,读起来像

    {
      "mods": [
        {
            "name": "somename",
            "enabled": true
        },
        {
            "name": "someothername",
            "enabled": false
        }
      ]
    }
    

    我正试图将样板从中剥离出来进行演示和人工编辑,然后重新插入样板。我有一个人性化的转变,它紧凑而合理:

    jq '[ .mods[]|{(.name): .enabled} ] | add' mod-list.json
    
    {
      "somename": true,
      "someothername": false
    }
    

    但我坚持走另一条路:我希望将上面的输出转换回它的输入。

    我看了看 keys_unsorted,.[] 但我不知道如何将序列拼接在一起,手册中对键“大致按插入顺序”有令人担忧的评论,这让我渴望得到一些更明确的保证,即该结构中的键和值序列即使不是原始序列,也至少会按相同的顺序。

    我还尝试了foreach和reduce,它们非常接近,但(a)它们将键组合成一个数组,(b)我不知道如何获得相应的值:

    jq 'foreach keys as $key ({};{name:$key, enabled:false}'
    

    所以这就是我陷入困境的地方。

    1 回复  |  直到 3 年前
        1
  •  1
  •   pmf    3 年前

    使用 to_entries 可以是一种方式:

    {mods: to_entries | map({name: .key, enabled: .value})}
    

    Demo

    使用 keys keys_unsorted 可能是另一个:

    {mods: [keys_unsorted[] as $name | {$name, enabled: .[$name]}]}
    

    Demo

    输出:

    {
      "mods": [
        {
          "name": "somename",
          "enabled": true
        },
        {
          "name": "someothername",
          "enabled": false
        }
      ]
    }