提问人:JQamateur 提问时间:10/27/2023 更新时间:10/27/2023 访问量:37
JQ:删除嵌套数组中重复的 JSON 对象
JQ: Delete JSON object with duplicates in nested array
问:
我有以下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 没有任何影响。有人可以帮我解决这个问题吗?
答:
0赞
pmf
10/27/2023
#1
在我的例子中,我想删除.[0] 因为 Q1 的所有三个值都相同 (“all_answers” : [ “a”, “a”, “a” ])。应该至少有一个不同的“答案”,比如 [ “a”, “b”, “b” ] 才能保留
如果您希望至少有一对具有不同值的项目,请检查数组的长度是否大于 :unique
1
.[] |= 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)
false
null
unique[1]
min != max
0赞
JQamateur
10/27/2023
是的,当然。。。对不起,有时你不能只见树木不见森林......谢谢
下一个:根据一些自定义规则创建嵌套词典
评论