我有一个对象数组,我想删除这个数组中的一些副本,但是我想保留重复项的数量。
我的意见是:
[
{
"foo": 1,
"bar": "a",
"baz": "whatever"
},
{
"foo": 1,
"bar": "a",
"baz": "hello"
},
{
"foo": 1,
"bar": "b",
"baz": "world"
}
]
(不确定它是否重要,但对象的唯一性基于foo
和bar
,而不是baz
。
所需输出的一个例子是:
[
{
"foo": 1,
"bar": "a",
"baz": "whatever",
"count": 2
},
{
"foo": 1,
"bar": "b",
"baz": "world",
"count": 1
}
]
甚至:
[
{
"count": 2,
"data": {
"foo": 1,
"bar": "a",
"baz": "whatever"
}
},
...
]
我知道如何处理唯一性部分(使用unique_by([.foo, .bar])
)但不知道计数部分。
答案 0 :(得分:1)
您可以使用基于group_by(.foo,.bar)
| map(.[]+{"count":length})
| unique_by(.foo,.bar)
的以下命令:
[
{
"foo": 1,
"bar": "a",
"baz": "whatever",
"count": 2
},
{
"foo": 1,
"bar": "b",
"baz": "world",
"count": 1
}
]
输出:
group_by(.foo,.bar)
| map({"count":length,"data":(unique_by(.foo,.bar)[])})
您提到的其他输出可以使用以下命令实现:
[
{
"count": 2,
"data": {
"foo": 1,
"bar": "a",
"baz": "whatever"
}
},
{
"count": 1,
"data": {
"foo": 1,
"bar": "b",
"baz": "world"
}
}
]
输出:
{{1}}
答案 1 :(得分:1)
以下解决方案使用peak的GROUPS_BY代替group_by/1来避免排序:
def GROUPS_BY(stream; f): reduce stream as $x ({}; .[$x|f] += [$x] ) | .[] ;
GROUPS_BY(.[]; {foo,bar}|tostring)
| .[0].count = length
| .[0]