使用jq通过非唯一键将数组转换为对象

时间:2020-03-17 18:03:58

标签: json jq

我有一个像这样的JSON数组:

[
  {
    "name": "Bo",
    "type": "dog"
  },
  {
    "name": "Roxer",
    "type": "dog"
  },
  {
    "name": "Paws",
    "type": "cat"
  }
]

我正在尝试将其转换为以type为键的对象,如下所示:

{
  "dog": [
    {
      "name": "Bo",
      "type": "dog"
    },
    {
      "name": "Roxer",
      "type": "dog"
    }
  ],
  "cat": [
    {
      "name": "Paws",
      "type": "cat"
    }
  ]
}

我发现this answer使用了map,但是它假设type是唯一的,并且没有将其转换为数组:

reduce .[] as $i ({}; .[$i.type] = $i)

第一次插入值时,应将其插入为[$i]。在任何其他时间,都应附加[] + $i

2 个答案:

答案 0 :(得分:4)

您的情况不同于the one you found,因为您将对象放入数组中。尝试对Jeff Mercado的解决方案进行此修改。

@Poller

答案 1 :(得分:1)

group_by()字段上使用.type然后用.type作为键创建最终结果的另一种可能的方法

jq 'group_by(.type)[] | { (.[0].type) : . }'

此方法的唯一区别是group_by()在产生结果之前按.type字段进行排序,因此键的顺序将有所不同。