我有以下 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 没有任何影响。有人可以帮我吗?
我只想保留顶级数组 .[] 中的条目,这些条目在 . 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"
}
}
}
]