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

JQ: Delete JSON object with duplicates in nested array

提问人:JQamateur 提问时间:10/27/2023 更新时间:10/27/2023 访问量:37

问:

我有以下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 没有任何影响。有人可以帮我解决这个问题吗?

嵌套 重复项 JQ

评论


答:

0赞 pmf 10/27/2023 #1

在我的例子中,我想删除.[0] 因为 Q1 的所有三个值都相同 (“all_answers” : [ “a”, “a”, “a” ])。应该至少有一个不同的“答案”,比如 [ “a”, “b”, “b” ] 才能保留

如果您希望至少有一对具有不同值的项目,请检查数组的长度是否大于 :unique1

.[] |= select(.ratings.q1.all_answers | unique | length > 1)
[
  {
    "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"
      }
    }
  }
]

演示

评论

0赞 JQamateur 10/27/2023
对不起,不清楚。在我的例子中,我想删除.[0] 因为 Q1 的所有三个值都相同 (“all_answers” : [ “a”, “a”, “a” ])。应该至少有一个不同的“答案”,比如 [ “a”, “b”, “b” ] 才能保留
0赞 pmf 10/27/2023
然后检查就足够了。unique | length > 1
0赞 pmf 10/27/2023
...您还可以检查唯一数组是否有第二个元素(在从 0 开始的索引 1 处):;或者只是尝试访问该项目(如果保证不是或):;或者只是检查最低值和最高值是否不同: ;...unique | has(1)falsenullunique[1]min != max
0赞 JQamateur 10/27/2023
是的,当然。。。对不起,有时你不能只见树木不见森林......谢谢