用jq重新构造JSON文件:在数组中重新组合值

用jq重新构造JSON文件:在数组中重新组合值,json,group-by,aggregate,jq,Json,Group By,Aggregate,Jq,我是jq新手,我不太明白如何转换JSON文件,格式如下: [ { "name": "person 1", "code": "AAA", "latitude": 11, "longitude": 22 }, { "name": "person 2", "code": "AAA", "latitude": 11, "longitude": 22 }, { "name": "person 3", "

我是jq新手,我不太明白如何转换JSON文件,格式如下:

[
  {
    "name": "person 1",
    "code": "AAA",
    "latitude": 11,
    "longitude": 22 
  },
  {
    "name": "person 2",
    "code": "AAA",
    "latitude": 11,
    "longitude": 22 
  },
  {
    "name": "person 3",
    "code": "BBB",
    "latitude": 33,
    "longitude": 44 
  },
  {
    "name": "person 4",
    "code": "BBB",
    "latitude": 33,
    "longitude": 44 
  }
]
为此:

[
  {
   "code": "AAA",
   "latitude": 11,
   "longitude": 22,
   "people": ["person 1", "person 2"]
  },
  {
   "code": "BBB",
   "latitude": 33,
   "longitude": 44,
   "people": ["person 3", "person 4"]
  }
]

我知道了如何使用
map()
unique
来获得
code
纬度
经度
的唯一组合,但不知道如何将名称添加到数组中。

下面是一个使用
group\u by
的简单解决方案:

group_by(.code)
| map( reduce .[] as $x (.[0] | del(.name); 
         .people += [$x.name]) )

这里有一个比使用
groupby
更有效的解决方案,因为后者涉及排序

使用内置的
索引/1
,以及通用函数
聚合可以实现效率,其定义如下:

def aggregate_by(s; f; g):
  reduce s as $x  (null; .[$x|f] += [$x|g]);

aggregate_by(.[]; .code; .name) as $dict
| INDEX(.code)
| [.[]]
| map(del(.name) | .person = $dict[.code])