json - 根据子数组的值删除json数组元素
问题描述
我有以下包含此数组结构的 json 文件:
{
"outer": [
{
"inner": [
{
"value": "val1"
},
{
"value": "val3"
}
]
},
{
"inner": [
{
"value": "val2"
},
{
"value": "val1"
}
]
},
{
"inner": [
{
"value": "val2"
},
{
"value": "val1"
},
{
"value": "val3"
}
]
}
]
}
我想inner
从outer
数组中删除其元素具有特定值并且具有特定长度的数组。例如,如果我想删除inner
包含值的数组,"val1"
结果"val2"
应该是:
{
"outer": [
{
"inner": [
{
"value": "val1"
},
{
"value": "val3"
}
]
},
{
"inner": [
{
"value": "val2"
},
{
"value": "val1"
},
{
"value": "val3"
}
]
}
]
}
我努力了
jq 'del( .outer[]|select(.inner[0].value == "val1"))'
但我不知道如何检查第二个条件,即长度,除此之外,这些值可能以任何顺序出现。
解决方案
jq
您正在寻找的过滤器是:
del(.outer[] | select(.inner | map(.value) | sort == ["val1", "val2"]))
.inner | map(.value)
生成一个数组,其中包含与 所包含的value
所有对象中的键关联的值.inner
。
sort
需要,因为==
对数组进行一对一的比较。这样,.inner
无论它们的顺序如何,它都会匹配包含的对象。当然,您必须在右侧使用排序数组(即["val1", "val2"]
而不是["val2", "val1"]
)。
看到它在行动。
推荐阅读
- azure-devops - vsrm.dev.azure.com 被 CORS 阻止
- javascript - 更改 chrome 扩展中的 javascript 上下文
- c - 为什么 strace 没有在 strace 中列出 gettimeofday()
- apache-kafka - KafkaStreams 中的 INCOMPLETE_SOURCE_TOPIC_METADATA 错误
- c++ - IDE 和动态内存
- ruby-on-rails - 如何在数据库中查询表中某个值与 Rails 中数组中的某个值相匹配的所有项目?
- asp.net-core - ef core 播种数据时出错
- python - 遍历所有海龟变量
- visual-studio - Win32 API 没有本地帮助内容
- ruby-on-rails - 在多态关联上,是否可以通过查询在一个 has_many 上引入多种源类型?