使用 JQ 分组并删除数组对象中的重复项
Group by and remove duplicates across arrays objects using JQ
鉴于 json,我需要在所有站点->建筑物->楼层中按键 userName
对象 userClientDetailDTOList
进行分组,并删除任何重复的 mac 地址.
我已经能够使用 jq 表达式做到这一点 -
[.billingDetailPerSiteDTOList[].billingDetailPerBuildingDTOList[].billingDetailsPerFloorDTOList[].userClientDetailDTOList[] ] | group_by(.userName) | map((.[0]|del(.associatedMacs)) + { associatedMacs: (map(.associatedMacs[]) | unique) })
这按 userName
分组并删除属于特定用户的重复项 macs
。这导致列表为
[
{
"userName": "1",
"associatedMacs": [
"3:3:3:3:3:3",
"5:5:5:5:5:5"
]
},
{
"userName": "10",
"associatedMacs": [
"4:4:4:4:4:4",
"6:6:6:6:6:6"
]
},
{
"userName": "2",
"associatedMacs": [
"1:1:1:1:1:1",
"2:2:2:2:2:2"
]
},
{
"userName": "3",
"associatedMacs": [
"2:2:2:2:2:2"
]
}
]
问题:
- 表达式可以简化吗?
- 如何删除所有用户的重复 mac 地址? mac 地址
2:2:2:2:2:2
重复用于用户 2
和 3
过滤器几乎是最好的了。如果你真的想,你仍然可以改变
del(.associatedMacs)
到 {userName}
为正定义,
(…) + {…}
到{userName: …, associatedMacs: …}
避免加法,
导致
… | map({userName: (.[0].userName), associatedMacs: (map(.associatedMacs[]) | unique)})
至于第二个问题,如果您将输入视为 IP 上的 INDEX
,您基本上可以重用之前的代码(当然,unique
部分不会不再需要)
[INDEX(…; .associatedMacs[])[]] | group_by(.userName) | map(…)
[
{
"userName": "1",
"associatedMacs": [
"3:3:3:3:3:3",
"5:5:5:5:5:5"
]
},
{
"userName": "10",
"associatedMacs": [
"4:4:4:4:4:4",
"6:6:6:6:6:6"
]
},
{
"userName": "2",
"associatedMacs": [
"1:1:1:1:1:1"
]
},
{
"userName": "3",
"associatedMacs": [
"2:2:2:2:2:2"
]
}
]
鉴于 json,我需要在所有站点->建筑物->楼层中按键 userName
对象 userClientDetailDTOList
进行分组,并删除任何重复的 mac 地址.
我已经能够使用 jq 表达式做到这一点 -
[.billingDetailPerSiteDTOList[].billingDetailPerBuildingDTOList[].billingDetailsPerFloorDTOList[].userClientDetailDTOList[] ] | group_by(.userName) | map((.[0]|del(.associatedMacs)) + { associatedMacs: (map(.associatedMacs[]) | unique) })
这按 userName
分组并删除属于特定用户的重复项 macs
。这导致列表为
[
{
"userName": "1",
"associatedMacs": [
"3:3:3:3:3:3",
"5:5:5:5:5:5"
]
},
{
"userName": "10",
"associatedMacs": [
"4:4:4:4:4:4",
"6:6:6:6:6:6"
]
},
{
"userName": "2",
"associatedMacs": [
"1:1:1:1:1:1",
"2:2:2:2:2:2"
]
},
{
"userName": "3",
"associatedMacs": [
"2:2:2:2:2:2"
]
}
]
问题:
- 表达式可以简化吗?
- 如何删除所有用户的重复 mac 地址? mac 地址
2:2:2:2:2:2
重复用于用户2
和3
过滤器几乎是最好的了。如果你真的想,你仍然可以改变
del(.associatedMacs)
到{userName}
为正定义,(…) + {…}
到{userName: …, associatedMacs: …}
避免加法,
导致
… | map({userName: (.[0].userName), associatedMacs: (map(.associatedMacs[]) | unique)})
至于第二个问题,如果您将输入视为 IP 上的 INDEX
,您基本上可以重用之前的代码(当然,unique
部分不会不再需要)
[INDEX(…; .associatedMacs[])[]] | group_by(.userName) | map(…)
[
{
"userName": "1",
"associatedMacs": [
"3:3:3:3:3:3",
"5:5:5:5:5:5"
]
},
{
"userName": "10",
"associatedMacs": [
"4:4:4:4:4:4",
"6:6:6:6:6:6"
]
},
{
"userName": "2",
"associatedMacs": [
"1:1:1:1:1:1"
]
},
{
"userName": "3",
"associatedMacs": [
"2:2:2:2:2:2"
]
}
]