Arrays jq-删除JSON文件中所有数组中的重复项
我有以下JSON文件Arrays jq-删除JSON文件中所有数组中的重复项,arrays,json,search,jq,Arrays,Json,Search,Jq,我有以下JSON文件 [ { "name": "first", "Arrays": { "dddd0001": [ "A", "A", "B", "B&quo
[
{
"name": "first",
"Arrays": {
"dddd0001": [
"A",
"A",
"B",
"B",
"C",
"C",
"C",
"C",
"D",
"E",
"F"
]
}
},
{
"name": "second",
"Arrays": {
"dddd0002": [
"AA",
"AA",
"BA",
"BB",
"CC",
"CC",
"CC",
"CC",
"DD",
"DD",
"FF"
]
}
},
{
"name": "third",
"Arrays": {
"dddd0003": [
"1",
"1",
"2",
"3",
"3",
"4",
"4",
"4",
"0",
"0",
"0"
]
}
}
]
我需要删除JSON文件中每个数组中的重复项。所以结果应该如下所示
[
{
"name": "first",
"Arrays": {
"dddd0001": [
"A",
"B",
"C",
"D",
"E",
"F"
]
}
},
{
"name": "second",
"Arrays": {
"dddd0002": [
"AA",
"BA",
"BB",
"CC",
"DD",
"FF"
]
}
},
{
"name": "third",
"Arrays": {
"dddd0003": [
"1",
"2",
"3",
"4",
"0"
]
}
}
]
数组键名称事先未知。数组
对象中可能有多个数组。
我试图通过使用unique\u,但它需要密钥名
这个算法——搜索Arrays对象中的每个数组,对于每个这样的数组应用unique
函数,将结果重新分配回数组——应该很容易实现,但我被卡住了
谢谢。
var jsonArr=[
{
“名称”:“第一”,
“数组”:{
“DD0001”:[
“A”,
“A”,
“B”,
“B”,
“C”,
“C”,
“C”,
“C”,
“D”,
“E”,
“F”
]
}
},
{
“名称”:“第二个”,
“数组”:{
“DD0002”:[
“AA”,
“AA”,
“BA”,
“BB”,
“抄送”,
“抄送”,
“抄送”,
“抄送”,
“DD”,
“DD”,
“FF”
]
}
},
{
“姓名”:“第三名”,
“数组”:{
“DD0003”:[
"1",
"1",
"2",
"3",
"3",
"4",
"4",
"4",
"0",
"0",
"0"
]
}
}
]
for(var i=0;iarrtmp2.indexOf(v)==p);
log(jsonArr[i])
}
var jsonArr=[
{
“名称”:“第一”,
“数组”:{
“DD0001”:[
“A”,
“A”,
“B”,
“B”,
“C”,
“C”,
“C”,
“C”,
“D”,
“E”,
“F”
]
}
},
{
“名称”:“第二个”,
“数组”:{
“DD0002”:[
“AA”,
“AA”,
“BA”,
“BB”,
“抄送”,
“抄送”,
“抄送”,
“抄送”,
“DD”,
“DD”,
“FF”
]
}
},
{
“姓名”:“第三名”,
“数组”:{
“DD0003”:[
"1",
"1",
"2",
"3",
"3",
"4",
"4",
"4",
"0",
"0",
"0"
]
}
}
]
for(var i=0;iarrtmp2.indexOf(v)==p);
log(jsonArr[i])
}
您可以使用unique
和|=
:
$ jq '.[].Arrays[] |= unique' file.json
[
{
"name": "first",
"Arrays": {
"dddd0001": [
"A",
"B",
"C",
"D",
"E",
"F"
]
}
},
{
"name": "second",
"Arrays": {
"dddd0002": [
"AA",
"BA",
"BB",
"CC",
"DD",
"FF"
]
}
},
{
"name": "third",
"Arrays": {
"dddd0003": [
"0",
"1",
"2",
"3",
"4"
]
}
}
]
$
唯一的“问题”是unique
对数组的元素进行排序,因此,例如“dddd0003”
数组的内容与预期结果的顺序不同。我不知道这对你来说是否是个问题
如果“array”
属性也可以包含“non-array”值,则可以格外小心地“过滤”那些“non-array”值,以便unique
不会抱怨
select(type==“array”)
可以使用:(输出省略):
或数组
:
$ jq '(.[].Arrays[] | arrays) |= unique' file.json
...
最后两个解决方案更好地反映了您的算法。您可以使用unique
和=“code>:
$ jq '.[].Arrays[] |= unique' file.json
[
{
"name": "first",
"Arrays": {
"dddd0001": [
"A",
"B",
"C",
"D",
"E",
"F"
]
}
},
{
"name": "second",
"Arrays": {
"dddd0002": [
"AA",
"BA",
"BB",
"CC",
"DD",
"FF"
]
}
},
{
"name": "third",
"Arrays": {
"dddd0003": [
"0",
"1",
"2",
"3",
"4"
]
}
}
]
$
walk( if type == "array" then unique else . end)
唯一的“问题”是unique
对数组的元素进行排序,因此,例如“dddd0003”
数组的内容与预期结果的顺序不同。我不知道这对你来说是否是个问题
如果“array”
属性也可以包含“non-array”值,则可以格外小心地“过滤”那些“non-array”值,以便unique
不会抱怨
select(type==“array”)
可以使用:(输出省略):
或数组
:
$ jq '(.[].Arrays[] | arrays) |= unique' file.json
...
最后两个解决方案更好地反映了您的算法
walk( if type == "array" then unique else . end)
如果应遵守原始订单,则可以轻松使用在中定义的“def uniques”
如果应该遵守原始顺序,那么您可以轻松使用中定义的“def uniques”,谢谢,但正如描述中所述,我正在寻找jq.oops的解决方案。我的错误。抱歉,谢谢,但正如描述中所说,我正在寻找一个使用jq.oops的解决方案。我的错误。对不起,马可,非常感谢你。它确实解决了这个问题,只要数组的键名在本例中为“arrays”是已知的。@Invisible999是的,我必须承认,从这个意义上讲,它不是一个非常“通用”的解决方案。很高兴我帮了你一点忙:)马可,非常感谢。它确实解决了这个问题,只要数组的键名在本例中为“arrays”是已知的。@Invisible999是的,我必须承认,从这个意义上讲,它不是一个非常“通用”的解决方案。很高兴我帮了你一点忙:)谢谢你提供的解决方案-工作完美。我是否正确理解了uniqie
不仅对数组内容进行排序,而且还根据数组键名对数组进行排序?unique
本身只对作为其输入的数组进行排序。感谢您提供解决方案-效果非常好。我是否正确地理解了uniqie
不仅对数组内容进行排序,而且还基于数组键名对数组进行排序?unique
本身仅对