使用 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"
    ]
  }
]

Live example

问题:

  1. 表达式可以简化吗?
  2. 如何删除所有用户的重复 mac 地址? mac 地址 2:2:2:2:2:2 重复用于用户 23

过滤器几乎是最好的了。如果你真的想,你仍然可以改变

  • del(.associatedMacs){userName} 为正定义,
  • (…) + {…}{userName: …, associatedMacs: …}避免加法,

导致

… | map({userName: (.[0].userName), associatedMacs: (map(.associatedMacs[]) | unique)})

Demo


至于第二个问题,如果您将输入视为 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"
    ]
  }
]

Demo