JQ:删除嵌套数组中重复的 JSON 对象

问题描述 投票:0回答:1

我有以下 JSON:

[
{
  "ratings" : {
    "q1" : {
      "all_answers" : [ "a", "a", "a" ],
      "top_answer" : "a"
    },
    "q2" : {
      "all_answers" : [ "no", "yes", "yes" ],
      "top_answer" : "yes"
    }
},
{
  "ratings" : {
    "q1" : {
      "all_answers" : [ "a", "b", "b" ],
      "top_answer" : "a"
    },
    "q2" : {
      "all_answers" : [ "no", "yes", "yes" ],
      "top_answer" : "yes"
    }
},
{
  "ratings" : {
    "q1" : {
      "all_answers" : [ "a", "b", "c" ],
      "top_answer" : "a"
    },
    "q2" : {
      "all_answers" : [ "no", "yes", "yes" ],
      "top_answer" : "yes"
    }
},
{
...
}
]

我正在尝试创建一个 jq 脚本,该脚本可以识别 q1 中的数组“all_answers”是否有重复条目并删除整个对象。最后,我只想保留顶级数组 .[] 中的条目,这些条目在 . ratings.q1.all_answers 中至少有一个不同的条目。

我的方法是在删除重复项后计算数组的长度,然后将其与原始长度进行比较。

jq '.[] |= select(.ratings.q1.all_answers | length as $len | $len > ($len - (. | unique | length)))'

执行此操作时我没有收到错误,但它似乎对 json 没有任何影响。有人可以帮我吗?

nested duplicates jq
1个回答
0
投票

我只想保留顶级数组 .[] 中的条目,这些条目在 . ratings.q1.all_answers 中至少有一个不同的条目。

我不确定我是否理解“发散入口”是什么意思。但是

unique
会自动对数组进行排序,您可以将其与刚刚
sort
ed 的版本进行比较。

.[] |= select(.ratings.q1.all_answers | unique != sort)
[
  {
    "ratings": {
      "q1": {
        "all_answers": [
          "a",
          "b",
          "c"
        ],
        "top_answer": "a"
      },
      "q2": {
        "all_answers": [
          "no",
          "yes",
          "yes"
        ],
        "top_answer": "yes"
      }
    }
  }
]

演示

或者测试相反的情况:

.[] |= select(.ratings.q1.all_answers | unique != sort)
[
  {
    "ratings": {
      "q1": {
        "all_answers": [
          "a",
          "a",
          "a"
        ],
        "top_answer": "a"
      },
      "q2": {
        "all_answers": [
          "no",
          "yes",
          "yes"
        ],
        "top_answer": "yes"
      }
    }
  },
  {
    "ratings": {
      "q1": {
        "all_answers": [
          "a",
          "b",
          "b"
        ],
        "top_answer": "a"
      },
      "q2": {
        "all_answers": [
          "no",
          "yes",
          "yes"
        ],
        "top_answer": "yes"
      }
    }
  }
]

演示

© www.soinside.com 2019 - 2024. All rights reserved.